【问题标题】:Printing Japanese characters in C program在 C 程序中打印日文字符
【发布时间】:2020-05-01 09:34:33
【问题描述】:

我想用 C 程序打印日文字符。 我找到了一些日文字符的 Unicode 范围,将它们转换为十进制并使用 for 循环打印它们:

setlocale(LC_ALL, "ja_JP.UTF8");
for (int i = 12784; i <= 12799; i++) {
  printf("%c\n",i);
}

locale.h 和 wchar.h 存在于标头中。

输出只给我??????????字符。

请告诉我如何解决。

【问题讨论】:

  • 您的字体是否包含日文字符?

标签: c unicode setlocale


【解决方案1】:

%c 只能打印从 0 到 127 的字符,用于扩展字符:

printf("%lc\n", i);

或者更好

wprintf(L"%lc\n", i);

【讨论】:

  • 谢谢。我添加了 %lc。奇怪,现在 printf 不打印任何东西。你知道可能出了什么问题吗?
  • 你可以试试setlocale(LC_ALL, "");吗?它对我有用:ideone.com/AFX4DK,也正如 @domsson 在 cmets 中指出的那样:检查您的控制台字体是否支持日文图形。
  • setlocale(LC_ALL, "") 已解决此问题。非常感谢你!最后一个问题。我认为需要指定我想要使用的语言环境,所以我使用了 ja_JP.UTF8。我只是对为什么 setlocale(LC_ALL, "") 也有效。
【解决方案2】:

除了@David Ranieri很好的答案,我想解释一下“输出只给我??????????字符。”


"%c" 接受 int 参数。回想一下,传递给... 函数的char 被转换为int。那么

int 参数被转换为unsigned char,并写入生成的字符。 C17dr § 7.21.6.1 8.

因此 printf("%c" ... 处理值 0-255。超出该范围的值将转换为该范围。


下面的 OP 代码用十六进制重写。

// for (int i = 12784; i <= 12799; i++) {
for (int i = 0x31F0; i <= 0x31FF; i++) {
  printf("%c\n",i);
}

使用 OP 语言环境设置和实施,打印值 [0xF0 - 0XFF] 导致 '?'。我相信 OP 的 [0x80 - 0xFF] 也是如此。存在其他可能性。我收到了

如果 OP 完成以下操作,将会看到更熟悉的输出,但不是所需的平假名字符。

for (int i = 0x3041; i <= 0x307E; i++) {
  printf("%c",i);
}

ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-02
    • 2011-01-07
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多