|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
06.07.2019, 15:02 | #1 |
Новичок
Джуниор
Регистрация: 06.07.2019
Сообщений: 2
|
Windows, C++, Киррилица и именованные каналы
Всем привет. Решил портировать кое-какой код под Виндовс.
Код делает дочерний процесс и соединяется с ним через два пайпа для IPC. Т.е. чтобы родитель мог писать в ребенка и ребенок чтобы мог писать в родителя. В Линукс в этом плане все хорошо и работает через анонимные пайпы. В Виндовс пришлось использовать именнованные, для Overlapped. Благо что именнованные так же как и анонимные могут прицепляться к STARTUPINFO. В общем проблема одно - кодировки. Т.е .если я в порождённый процесс кидаю исключительно латинские буквы он их нормально принимает, и отвечает ими же (для теста возвращает тоже что и получил). А вот киррилица обрывает ввод/вывод. Если запускать каждое приложение по отдельности то они нормально работают как с латиницей так и с киррилицей. Такое впечателение что через каналы кириллические символы передаются в какой-то не правильной кодировке и происходит ошибка на потоках ввода-вывода. Я пробовал всякие манипуляции с setlocale и c std::locale::global(std::locale("ru _RU.UTF-8")); - результов не давало, хотя стоит сказать что в некоторых случаях от ребенка вообще ничего не приходило (похоже поток входил в сотояние ошибки и не работал) а в некоторых случаях приходил текст в виде "кракозябр" - т.е. не в правильной кодировке. Сейчас не буду пробовать закопипастить все варианты которые я пробовал через setlocale - но в итоге не один не заработал. Может кто сталкивался с подобной проблемой. Удивительно но такое впечатление что через пайпы никто кириллицу в винде не гоняет, а все солюшены в инете исключительно про чисто ввод и вывод в Консоль - где конечно же у меня и без этих солюшенов все работает. А вот с пайпами засада. |
06.07.2019, 16:38 | #2 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,760
|
Скорее всего вы при обработке строк, например при чтении/записи, не учитываете, что приходит юникод. Кидаете их анси функциям, которые воспринимают единичный нулевой байт как конец строки.
|
07.07.2019, 17:26 | #3 | |
Новичок
Джуниор
Регистрация: 06.07.2019
Сообщений: 2
|
Цитата:
раньше были такие строчки по подготовки локальи для винверсии setlocale(LC_ALL, ".866"); _wsetlocale(LC_ALL, L".866"); а после того как добавил еще такие auto myLocale = std::locale("rus_rus.866"); std::wcout.imbue(myLocale); std::wcin.imbue(myLocale); то все заработало. Но правда я совершенно не понимаю как оно работает) Чуть позже попробую сформулировать непонятные моменты и спросить про них Последний раз редактировалось bonta; 07.07.2019 в 17:32. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Символ каны в названии файла, латиница и киррилица внутри как сделать | HellMercenariess | Общие вопросы Delphi | 0 | 19.02.2017 07:13 |
как создавать именованные индексаторы для класса | OmegaBerkut | C# (си шарп) | 85 | 15.09.2016 22:15 |
Динамические именованные диапазоны | DiemonStar | Microsoft Office Excel | 4 | 25.12.2012 13:33 |
Именованные таблицы | DiemonStar | Microsoft Office Excel | 4 | 02.10.2012 18:02 |
Именованные ячейки | Foxx | Microsoft Office Excel | 1 | 20.02.2012 00:33 |