Как я могу печатать символы других языков в Microsoft C++?

Мы можем напечатать любой английский символ с журналом, поставив "%c". Возьми другой случай. Раскладка клавиатуры была изменена. Теперь я использую корейский / китайский язык. Мы не можем просто поместить "% c" в журнал, чтобы напечатать эти символы.

Как мы можем достичь этого?

2 ответа

Как вы пишете в журнал? Если это printfПредлагаю перейти на wprintfи убедитесь, что ваш ввод с клавиатуры читается в wchar_t. Тогда вы можете использовать %lc распечатать свой характер.

Единственная небольшая загвоздка в том, что некоторые китайские иероглифы даже не помещаются в один wchar_t (те, что в Unicode-символах U+10000 и выше). Для тех, вы должны будете прочитать в wchar_t массив (или std::wstring) и распечатать с %ls,

Примечание: стандарт на самом деле не определяет, насколько большой wchar_t есть, и на платформах Unix, это обычно для wchar_t быть 32-битным, поэтому он может содержать любую единственную кодовую точку Unicode как одно значение UTC-4. Windows-NT была разработана до того, как стало очевидно, что 65536 символов недостаточно, поэтому API принял символы UTC-2. Когда Unicode был расширен до миллиона символов, было бы слишком разрушительно изменить размер символов, принимаемых API, поэтому они были преобразованы для принятия UTF-16. Для взаимодействия с этими API, wchar_t на платформах Windows обычно значение UTF-16.

Конечно, даже если wchar_t достаточно большой для кодовой точки, это не помогает, когда "символ" занимает более одной кодовой точки. Например, U+005A LATIN CAPITAL LETTER Z & U+0303 КОМБИНИРОВАНИЕ TILDE == Z̃ (я не знаю, существует ли язык, который использует его в качестве символа, но, похоже, для него не существует комбинированной формы.)

Как я понимаю, ваша проблема связана с использованием стандартных библиотек ввода / вывода C/C++, поэтому основная проблема заключается в системе ввода-вывода - функции из stdio.h и потоки из iostream обеспечивают ввод в зависимости от локализации.

Если вы хотите запомнить (записать в журнал) нажатую клавишу, без учета выбранного языка, я предлагаю использовать какой-то Windows API. Сначала прочитайте о вводе с клавиатуры в MSDN и посмотрите коды виртуальных клавиш. Затем обратитесь к примерам обработки сообщения WM_KEYDOWN, например, на форуме ссылок C++.

РЕДАКТИРОВАТЬ:

Но если проблема заключается только в записи корейского файла, решение может быть в локализации и формате данных - рассмотрим следующий пример:

#include <stdio.h>
#include <locale.h>
#include <wchar.h>
int main(void)
{
    // localization (perhaps needed for some computers)
    setlocale(LC_CTYPE, "Korean");
    // open log file for writing 
    FILE* outfile;
    outfile = _wfopen( L"log.txt",L"wt+,ccs=UTF-16LE");
    // test data
    wchar_t wch = L'술';
    // write one character to log file
    fwrite(&wch, sizeof(wchar_t), 1, outfile);
    // close file
    fclose(outfile);

    return 0;
}
Другие вопросы по тегам