#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.
Комментариев нет:
Отправить комментарий