如何在Microsoft C ++中打印其他语言字符?

时间:2015-12-22 06:10:21

标签: c++ visual-studio visual-studio-2010 mfc keyboard-layout

我们可以通过输入"%c"来打印任何带有日志的英文字符。 再举一个案例。 键盘布局已更改。 现在我输入的是一些韩语/中文。 我们不能简单地把"%c"在日志中打印这些字符。

我们如何实现这一目标?

2 个答案:

答案 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;
}