Здравствуйте господа-программисты! Разбираюсь с одним багом. Есть приложение в котором есть консоль в которой можно написать команду dir и она вернет результат своего выполнения. возвращает все как обычно - только вот размеры файлов возвращает коряво, а именно так (10 Dir(s) 436ÿ254ÿ840ÿ832 bytes free) - т.е. откуда то непонятный кодировки символ разделения. причем если в винде в региональных настройках выставить запятую то будет запятая, а если выставить пробел то вот такой символ получаем. Посмотрел в коде как реализована данная функциональность и оказалось что для подобных системных команд запускается дочерний процесс который выполняет команду и делает вывод в канал pipe. главный процесс потом с этого канала делает чтение ReadFile(hPipeRead, lpBuffer, sizeof(lpBuffer) - 1, &nBytesRead, NULL) и уже там находится этот левый символ. Процесс создается с наследуемыми настройками. Код корявый конечно - но боле-мене ничего. Кто с подобным сталкивался? Куда копать? Спасибо!
systemio, Не перекодируется корректно. Судя по всему дочерний процесс использует одну из OEM-кодировок, в которой NBSP соответствует 0xFF (к примеру, 866), а процесс-родитель интерпретирует результат как 1252 или что-то в этом роде.
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 Вопрос как бы открытый - что это такое и как с этим бороться?
Посмотри на листинг каталога с русскими именами файлов/подкаталогов — станет ясно, в какой кодировке происходит вывод dir. Я пощёлкал настройки в "Regional and Language Options" и получил при "Russian" разделителем групп символ NBSP (0xA0 в кодовой странице 1251, можно проверить в реестре значение sThousand в ветке HKCU\Control Panel\International, смотреть как "Binary Data"), при перекодировке в 866 переходит в 0xFF (который соответствует "я" в CP 1251). Так что всё ровно.