dir команда

Тема в разделе "WASM.BEGINNERS", создана пользователем systemio, 28 июн 2010.

  1. systemio

    systemio New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    98
    Здравствуйте господа-программисты!

    Разбираюсь с одним багом. Есть приложение в котором есть консоль в которой можно написать команду dir и она вернет результат своего выполнения. возвращает все как обычно - только вот размеры файлов возвращает коряво, а именно так (10 Dir(s) 436ÿ254ÿ840ÿ832 bytes free) - т.е. откуда то непонятный кодировки символ разделения. причем если в винде в региональных настройках выставить запятую то будет запятая, а если выставить пробел то вот такой символ получаем. Посмотрел в коде как реализована данная функциональность и оказалось что для подобных системных команд запускается дочерний процесс который выполняет команду и делает вывод в канал pipe. главный процесс потом с этого канала делает чтение ReadFile(hPipeRead, lpBuffer, sizeof(lpBuffer) - 1, &nBytesRead, NULL) и уже там находится этот левый символ. Процесс создается с наследуемыми настройками. Код корявый конечно - но боле-мене ничего.

    Кто с подобным сталкивался? Куда копать?

    Спасибо!
     
  2. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    systemio,

    Не перекодируется корректно. Судя по всему дочерний процесс использует одну из OEM-кодировок, в которой NBSP соответствует 0xFF (к примеру, 866), а процесс-родитель интерпретирует результат как 1252 или что-то в этом роде.
     
  3. systemio

    systemio New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    98
    baldr
    Слушай, действительно что-то с кодировкой. Я попробовал через виндовз консоль "dir >> c:\1.txt" и получил такое же
    ...
    11.06.2010 14:30 3я339 4098.pl
    11.06.2010 14:13 4я469 1198.pm
    8 File(s) 11я288 bytes
    4 Dir(s) 435я016я775я168 bytes free

    Вопрос как бы открытый - что это такое и как с этим бороться?
     
  4. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Посмотри на листинг каталога с русскими именами файлов/подкаталогов — станет ясно, в какой кодировке происходит вывод dir.

    Я пощёлкал настройки в "Regional and Language Options" и получил при "Russian" разделителем групп символ NBSP (0xA0 в кодовой странице 1251, можно проверить в реестре значение sThousand в ветке HKCU\Control Panel\International, смотреть как "Binary Data"), при перекодировке в 866 переходит в 0xFF (который соответствует "я" в CP 1251). Так что всё ровно.
     
  5. systemio

    systemio New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    98
    baldr
    Все спасибо большое - разобрался. Плюс вот тут (http://ru.wikipedia.org/wiki/Windows-1251)