|
Консоль Windows - вывод и ввод Юникода
|
|||
---|---|---|---|
#18+
Добрый день! Начал писать мини-проект: консольное приложение для Windows на C++. Для работы со строками выбрал std::string и std::wstring, если вдруг важно. И вот собственно у меня возник вопрос - а как бы мне в консоли выводить и вводить Юникод? Да так чтоб крайне желательно не поломалось "C:\Utils>myApp.exe>>myApp.log"? Прежде всего - а что предпочтительнее: std::cout/std::wcout? Или printf/wprintf? Что со всякими fputws и остальными? Ещё я пробовал WriteConsoleW - но строки выведенные таким образом у меня почему-то уже не попадают в "myApp.log". Далее, б о льшую часть текста я буду получать от W-функций WinAPI (что в них кстати - UTF-16 или UCS-2?) и класть в std::wstring. Это как-то повлияет на возможные решения проблемы? Вдруг придётся конвертировать в какой-нибудь UTF-8 перед выводом? Конечно не хотелось бы кучи лишних конвертаций... Вот сейчас я тыкаю палочкой в _setmode с _O_U16TEXT... Пока результаты достаточно неплохие, но я читал что оно типа не надёжное что ли, и может не работать в зависимости от неведомо чего. Из параметров командной строки надо бы тоже чтоб в Юникоде получать. Про это мне Гугл сказал что можно попробовать: либо вместо main использовать wmain, либо уже явно ко всяким GetCommandLineW и прочим. С этим ещё не попробовал, но вдруг у кого-то есть что подсказать по данному разрезу? :) Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 14:54 |
|
Консоль Windows - вывод и ввод Юникода
|
|||
---|---|---|---|
#18+
ResourceSpace, тыкай палочкой в std::locale ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2020, 10:36 |
|
Консоль Windows - вывод и ввод Юникода
|
|||
---|---|---|---|
#18+
ResourceSpace И вот собственно у меня возник вопрос - а как бы мне в консоли выводить и вводить Юникод? Да так чтоб крайне желательно не поломалось "C:\Utils>myApp.exe>>myApp.log"? Где крякозяблы или ошибки? Или на будущее и теория? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2020, 11:31 |
|
Консоль Windows - вывод и ввод Юникода
|
|||
---|---|---|---|
#18+
ResourceSpace Добрый день! Начал писать мини-проект: консольное приложение для Windows на C++. Для работы со строками выбрал std::string и std::wstring, если вдруг важно. И вот собственно у меня возник вопрос - а как бы мне в консоли выводить и вводить Юникод? ! ОДИН ОЧЕНЬ ХОРОШИЙ ЧЕЛОВЕК#if defined(_WIN32) || defined(_WIN64) #pragma execution_character_set("utf-8") #include<windows.h> const auto _dummy_ = []() { SetConsoleCP(65001); SetConsoleOutputCP(65001); return 0; }(); #endif авторПрежде всего - а что предпочтительнее: std::cout/std::wcout? Или printf/wprintf? Что со всякими fputws и остальными? Юникод невозможно обрабатывать в std::string, если ты не будешь применять специальные библиотеки для этого. Так что используй wchar_t пока... авторЭто как-то повлияет на возможные решения проблемы? Вдруг придётся конвертировать в какой-нибудь UTF-8 перед выводом? Конечно не хотелось бы кучи лишних конвертаций... Ты можешь поставить локейл utf-8 на консоль. авторИз параметров командной строки надо бы тоже чтоб в Юникоде получать. Если tmain применишь, то будешь и так. Ну и главный совет : работа с консолью в винде проклята, в юникоде -- проклята вдвойне. Реально всё будет работать только в грядущих последних релизах Windows 10. Зачем тебе это всё? Не так нужен юникод, особенно для начинающих (вроде ты такой). Пиши на английском, пиши в ANSI. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2020, 15:50 |
|
Консоль Windows - вывод и ввод Юникода
|
|||
---|---|---|---|
#18+
ResourceSpace Добрый день! Начал писать мини-проект: консольное приложение для Windows на C++. Для работы со строками выбрал std::string и std::wstring, если вдруг важно. И вот собственно у меня возник вопрос - а как бы мне в консоли выводить и вводить Юникод? Да так чтоб крайне желательно не поломалось "C:\Utils>myApp.exe>>myApp.log"? Прежде всего - а что предпочтительнее: std::cout/std::wcout? Или printf/wprintf? Что со всякими fputws и остальными? Ещё я пробовал WriteConsoleW - но строки выведенные таким образом у меня почему-то уже не попадают в "myApp.log". Далее, б о льшую часть текста я буду получать от W-функций WinAPI (что в них кстати - UTF-16 или UCS-2?) и класть в std::wstring. Это как-то повлияет на возможные решения проблемы? Вдруг придётся конвертировать в какой-нибудь UTF-8 перед выводом? Конечно не хотелось бы кучи лишних конвертаций... Вот сейчас я тыкаю палочкой в _setmode с _O_U16TEXT... Пока результаты достаточно неплохие, но я читал что оно типа не надёжное что ли, и может не работать в зависимости от неведомо чего. Из параметров командной строки надо бы тоже чтоб в Юникоде получать. Про это мне Гугл сказал что можно попробовать: либо вместо main использовать wmain, либо уже явно ко всяким GetCommandLineW и прочим. С этим ещё не попробовал, но вдруг у кого-то есть что подсказать по данному разрезу? :) Спасибо! Если не знакомы, поэкспериментируйте. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Скомпилируйте один раз под уникод, потом отдельно под MBCS, пользуясь ключами компилятора. Запустите программу в командном окне. Посмотрите на вывод на экране, посмотрите на вывод перенаправленый в файл (только не в ноутпаде, а в байтах). Попробуйте переименовать ехешник , чтобы он содержал буквы из разных языков одновременно. посмотрите на коды ошибок, найдите ответы на появившиеся у вас вопросы. Потом откройте новое окно командой cmd.exe /k /u и повторите ваши эксперименты. Если пишете в файлы, почитайте про BOM. Широкие функции винды это UTF-16, до Вин7 было наполовину UCS-2, но это в прошлом. WriteConsoleW пишет исключительно в консоль, не перенаправляется. Консоль может быть оказаться юникодовой или однобайтной. Были обещания сделать UTF-8 консоль, пока вроде не случилось. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2020, 20:10 |
|
|
start [/forum/topic.php?fid=57&msg=40016831&tid=2017290]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
others: | 273ms |
total: | 392ms |
0 / 0 |