Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
 Консоль Windows - вывод и ввод Юникода  [new]
ResourceSpace
Member

Откуда:
Сообщений: 27
Добрый день!

Начал писать мини-проект: консольное приложение для 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 ноя 20, 14:54    [22229604]     Ответить | Цитировать Сообщить модератору
 Re: Консоль Windows - вывод и ввод Юникода  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3603
ResourceSpace, тыкай палочкой в std::locale

Сообщение было отредактировано: 18 ноя 20, 10:31
18 ноя 20, 10:36    [22234406]     Ответить | Цитировать Сообщить модератору
 Re: Консоль Windows - вывод и ввод Юникода  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
ResourceSpace
И вот собственно у меня возник вопрос - а как бы мне в консоли выводить и вводить Юникод? Да так чтоб крайне желательно не поломалось "C:\Utils>myApp.exe>>myApp.log"?
а вот на прикладном уровне тебе счас что мешает?
Где крякозяблы или ошибки?
Или на будущее и теория?
18 ноя 20, 11:31    [22234440]     Ответить | Цитировать Сообщить модератору
 Re: Консоль Windows - вывод и ввод Юникода  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34630
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 ноя 20, 15:50    [22237286]     Ответить | Цитировать Сообщить модератору
 Re: Консоль Windows - вывод и ввод Юникода  [new]
НеофитSQL
Member [заблокирован]

Откуда: Маями
Сообщений: 760
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 и прочим.
С этим ещё не попробовал, но вдруг у кого-то есть что подсказать по данному разрезу? :)

Спасибо!


Если не знакомы, поэкспериментируйте.

int _tmain( int argc, TCHAR argv[] )
{
    _tputs( argv[0] );
    _tputchar( 'Q' ); 
    _tputchar( 'я' ); 
    _tputchar( '&#252;' ); 
    return 0;
}


Скомпилируйте один раз под уникод, потом отдельно под MBCS, пользуясь ключами компилятора.
Запустите программу в командном окне.
Посмотрите на вывод на экране, посмотрите на вывод перенаправленый в файл (только не в ноутпаде, а в байтах).
Попробуйте переименовать ехешник , чтобы он содержал буквы из разных языков одновременно.
посмотрите на коды ошибок, найдите ответы на появившиеся у вас вопросы.

Потом откройте новое окно командой cmd.exe /k /u

и повторите ваши эксперименты. Если пишете в файлы, почитайте про BOM.

Широкие функции винды это UTF-16, до Вин7 было наполовину UCS-2, но это в прошлом.
WriteConsoleW пишет исключительно в консоль, не перенаправляется. Консоль может быть оказаться юникодовой или однобайтной.
Были обещания сделать UTF-8 консоль, пока вроде не случилось.
23 ноя 20, 20:10    [22237462]     Ответить | Цитировать Сообщить модератору
Все форумы / C++ Ответить