2014-10-04 3 views
0

У меня проблемы с широкими строковыми литералами с использованием компилятора MinGW GCC на Windows.Широкие символы string literal

Когда я читаю пользовательский ввод, используя wscanf, wprintf выдает правильные национальные символы. Однако широкие строковые литералы останавливает вывод на первом национальном характере:

wprintf (L"China - Čína"); // outputs "China - " 

Предполагая, что wchar_t кодируется как UTF-16 по умолчанию (это такое LE или BE?), Как оно работает, когда источник находится в UTF-8 файл? Я попытался сохранить исходный код как UTF-16, но получаю незаконную последовательность байтов.

+0

Кодирование исходного кода не связан с кодировкой, используемой программой когда он работает. Ваш исходный код может быть в любой кодировке, которую вы хотите, до тех пор, пока компилятор знает, что это такое, чтобы он мог перевести ваши строковые литералы в набор символов времени исполнения. – Wyzard

+0

, в том числе '', а затем сделать вызов для' setlocale (LC_ALL, «sk»); '(или' 'cz" 'или какой бы язык был« Čína ») до этой строки' wprintf' у вас там, должен правильно отобразить текст, который вы положили. Однако это не так. Я не могу напечатать «Č» с перевернутым обводным акцентом. Извините ... – ThoAppelsin

+1

Проверьте с видом памяти в вашем отладчике область памяти, содержащую строку. Если он есть в памяти, это не проблема, связанная с компилятором. Если это не связано с компилятором, то это может быть какая-то причудливая проблема, связанная с библиотекой времени выполнения. Другим возможным случаем может быть то, что ваше устройство вывода (консольная или консольная эмуляция или что-то еще) не поддерживает каждый символ юникода, который вы хотите выводить и ведет себя иначе, чем вы ожидали бы в случае причудливых символов. – pasztorpisti

ответ

1

Как @pasztorpisti предложил, я попытался просмотра памяти и подстроку CINA хранится в виде 0C 01 ED 00 6E 00 61 00, который является правильным в UTF-16LE.

Моя консоль использует CP852 в качестве кодовой страницы по умолчанию, поэтому я пробовал chcp 1200, но он не установлен! MSDN says это только для управляемых приложений - Microsoft знает, как создать кодирующий ад.

Это было очень полезно прочитать внимательно this answer: Я использовал WriteConsoleW произвести вывод UTF-16LE в cripled консоли:

void putws(const wchar_t* str) { 
    WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), str, wcslen(str), NULL, NULL); 
} 

putws(L"China - Čína"); // outputs "China - Čína"