【问题标题】:How can I print other language characters in Microsoft C++?如何在 Microsoft C++ 中打印其他语言字符?
【发布时间】:2015-12-22 06:10:21
【问题描述】:

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

我们怎样才能做到这一点?

【问题讨论】:

  • 您想从虚拟键码列表 (msdn.microsoft.com/en-us/library/windows/desktop/…) 中保存键盘键码吗?
  • 你在使用printf吗?为什么不使用类型安全的 I/O 流,因为这是 C++
  • 任何英文字符?这太天真了,以刺为例(Þ,þ)......

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


【解决方案1】:

你是如何写入日志的?如果是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 的接口,Windows 平台上的 wchar_t 通常是一个 UTF-16 值。

当然,即使wchar_t 对于一个代码点来说足够大,当一个“字符”占用多个代码点时,这也无济于事。例如 U+005A LATIN CAPITAL LETTER Z & U+0303 COMBINING TILDE == Z̃ (我不知道是否有一种语言将其用作字符,但似乎没有组合形式。)

【讨论】:

  • 你可以为所有这些都使用一个 wstring 吗?您描述的第一种方法是否涵盖了最常见的汉字?
  • 是的,您可以对所有这些都使用 wstring。似乎有大约 2000 个字符;我不知道这是否是“最常见的”。
【解决方案2】:

据我了解,您的问题与使用标准输入/输出 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    相关资源
    最近更新 更多