Как я могу печатать символы других языков в 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;
}