powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Консоль Windows - вывод и ввод Юникода
6 сообщений из 6, страница 1 из 1
Консоль Windows - вывод и ввод Юникода
    #40016831
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 и прочим.
С этим ещё не попробовал, но вдруг у кого-то есть что подсказать по данному разрезу? :)

Спасибо!
...
Рейтинг: 0 / 0
Консоль Windows - вывод и ввод Юникода
    #40019831
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ResourceSpace, тыкай палочкой в std::locale
...
Рейтинг: 0 / 0
Консоль Windows - вывод и ввод Юникода
    #40019854
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ResourceSpace
И вот собственно у меня возник вопрос - а как бы мне в консоли выводить и вводить Юникод? Да так чтоб крайне желательно не поломалось "C:\Utils>myApp.exe>>myApp.log"?
а вот на прикладном уровне тебе счас что мешает?
Где крякозяблы или ошибки?
Или на будущее и теория?
...
Рейтинг: 0 / 0
Консоль Windows - вывод и ввод Юникода
    #40021439
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Консоль Windows - вывод и ввод Юникода
    #40021528
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
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 консоль, пока вроде не случилось.
...
Рейтинг: 0 / 0
Консоль Windows - вывод и ввод Юникода
    #40026407
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут точно без настроек chcp и выбора фонта (на картинке его нет, это было год назад)
хотите обойтись?
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Консоль Windows - вывод и ввод Юникода
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]