Мы можем напечатать любой английский символ с журналом, поставив «% c».
Возьми другой случай.
Раскладка клавиатуры была изменена.
Теперь я использую корейский / китайский язык.
Мы не можем просто поместить «% c» в журнал, чтобы напечатать эти символы.
Как мы можем достичь этого?
Как вы пишете в журнал? Если это 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;
}