我们可以通过输入"%c"来打印任何带有日志的英文字符。 再举一个案例。 键盘布局已更改。 现在我输入的是一些韩语/中文。 我们不能简单地把"%c"在日志中打印这些字符。
我们如何实现这一目标?
答案 0 :(得分:2)
你是如何写日志的?如果是wprintf
,我建议切换到%lc
,并确保将您的键盘输入读入wchar_t。然后,您可以使用wchar_t
打印出您的角色。
唯一轻微的问题是,有些中文字符甚至不适合单个wchar_t
(Unicode字符U + 10000及以上的字符)。对于那些,您必须阅读std::wstring
数组(或%ls
)并使用wchar_t
进行打印。
注意:标准实际上没有指定wchar_t
有多大,而在Unix平台上,wchar_t
通常为32位,因此它可以保存任何单个Unicode代码-point作为单个UTC-4值。 Windows-NT是在显然65536个字符不够用之前开发的,因此API采用了UTC-2字符。当Unicode扩展到一百万个字符时,改变API接受的字符大小会有太大的破坏性,因此它们被转换为接受UTF-16。为了与这些API接口,Windows平台上的wchar_t
通常是UTF-16值。
当然,即使{{1}}对于代码点来说足够大,但当“字符”占用多个代码点时,这也无济于事。例如U + 005A LATIN CAPITAL LETTER Z& U + 0303 COMBINING TILDE == Z(我不知道是否有一种语言将其用作角色,但似乎没有一种组合形式。)
答案 1 :(得分:1)
据我所知,您的问题与使用标准输入/输出C / C ++库有关,因此主要问题在于I / O系统 - 来自stdio.h的函数和来自iostream的流提供依赖于本地化的输入。
如果你想记住(写入日志)按键,而不考虑所选语言,我的建议是使用某种Windows API。 首先,请阅读Keyboard Input in MSDN并查看Virtual Key Codes。 然后,参考处理WM_KEYDOWN消息的示例,例如,在C++ references forum。
修改强>
但如果问题仅在于将韩文写入文件,则解决方案可以是本地化和数据格式 - 请考虑以下示例:
#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;
}