Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Как выводить на экран и вводить данные типа wchar_t[]?

#c #windows #unicode #mingw


Вопрос в том, как это сделать на Windows. На Linux-е это просто

setlocale(LC_CTYPE, "");
//а потом wprintf ...


На Windows такое не катит.
Желательно, чтобы вышло как-то так.

#ifdef __linux__ 
  setlocale(LC_CTYPE, "");
#elif defined _WIN32
  //Windows
#else


Нужно для вывода кириллицы, иероглифов и т. п.
Нужен именно wchar_t.

P. S. MinGW gcc -dumpversion 4.8.1

P. P. S. На MS Visual C++ 2010 работает ответ 1 (без stdafx.h)
    


Ответы

Ответ 1



Нужно вызвать _setmode(_fileno(stdout), _O_U16TEXT); #include #include #include int wmain(int argc, wchar_t* argv[]) { _setmode(_fileno(stdout), _O_U16TEXT); std::wcout << L"Testing unicode -- English -- Ελληνικά -- Español." << std::endl; // или wprintf(L"Testing unicode -- English -- Ελληνικά -- Español.\n"); return 0; } Поддержка конкретных символов зависит от шрифта консоли. Lucida Console и Consolas справляются со всем, кроме иероглифов. Решение взято из ответа на en-SO - Output unicode strings in Windows console app

Ответ 2



Традиционно поддержка Unicode в консоли Windows очень слаба, и вероятно для Windows вам стоит задуматься о графическом интерфейсе (в нём как раз обычно всё в порядке). В «свежих» версиях Visual Studio рантайм стал умнее, и с поддержкой Unicode стало лучше. Тем не менее, вам нужен как минимум шрифт, поддерживающий Unicode (например, Lucida Console). Например, мой экземпляр Visual Studio 2013 с вот таким исходником: #include "stdafx.h" #include #include #include int main(void) { _setmode(_fileno(stdout), _O_U16TEXT); wprintf(L"%s", L"кошка \x65e5\x672c\x56fd\n"); return 0; } выдал на экран кириллицу, но не иероглифы. При редиректе вывода в файл, однако, всё читается правильно. (Это означает, что проблема в шрифте.) С выводом RTL-текстов (иврит, арабский), однако, всё ещё возможны проблемы. Информация взята отсюда. (Ответ относится к toolchain'у Visual Studio.)

Ответ 3



О мой бог, cygwin мне помог... -- говорил когда-то святой Георгий. Cygwin выручил и меня! #ifdef __linux__ setlocale(LC_CTYPE, ""); #elif defined _WIN32 //Windows #else Теперь и этого не надо! Просто setlocale(LC_CTYPE, ""); Работает и на Linux, и на Windows (cygwin1.dll). Версия компилятора g++: 4.9.2. Версия Windows: XP SP3.

Комментариев нет:

Отправить комментарий