如何打印汉字?

时间:2014-03-20 07:04:47

标签: c printf

如何在C中打印中文或日文字符(非英文)?

wchar *wc = (wchar *)calloc(50,sizeof(wchar*));
wcscpy(wc ,L"john 麥克風");
printf(" wc : %S \n",wc);

我的输出中只有john

5 个答案:

答案 0 :(得分:4)

软件不了解"字符"。所有它知道的数字恰好被解释作为字符,无论其他软件实际显示你的输出。 (对于您的软件,a仅仅是0x61的别名。将0x61转换为识别为a的像素组合取决于终端,GUI或其他任何内容。)

  1. 源中非ASCII字符的处理是实现定义的,即由编译器决定如何处理源中的中文字符。如果您想要安全(和便携)播放,则必须使用其编码值编写非ASCII字符,例如:使用\x表示法。 (或者较新的\u,但这并没有明确地说明它已明确引用Unicode。)

  2. 此时你应该知道你必须同意你的程序关于你正在使用的编码,否则你的数值意味着你的程序完全不同。这是通过适当设置区域设置来完成的。 (编码ISO-8859-1和ISO-8859-15以及EBCDIC和...用于单字节,UTF-8和UTF-16以及EUC和ISO-2022-JP和...用于多字节,UCS-2和UTF-32以及其他可能广泛的......虽然所有应该是Unicode恕我直言,但它显然不是,即使没有外来物,也有三种截然不同的Unicode编码在那里。)

  3. 正如其他人已经指出的那样,如果你正在做什么"宽"输出,你应该使用" wide"输出功能。 (请注意"多字节" 完全是另一种类型的鱼,并且有8位多字节编码 - UTF-8 - 以及16位多字节编码 - UTF16 ......)

  4. 无论您打印输出(例如终端,GUI)都需要支持您的区域设置/编码,并且需要在其中添加字体实际上具有为相关代码点加载的字形(即可打印字符)的处理。 (否则你会得到"?",其他一些占位符,或者其中包含微小十六进制代码的一些有趣的东西。)

  5. 虽然您的实际问题很可能取决于使用printf()而不是wprintf(),但上述所有要点必须协同工作才能正确打印非ASCII字符。因此,您可能也有其他问题,但很难说。

答案 1 :(得分:2)

这是一个宽字符串,因此您需要wprintf

答案 2 :(得分:1)

确保终端使用UTF-8编码。 C ++本身是unicode不可知的。您还需要使用std::wcoutwprintf来打印这些内容。

答案 3 :(得分:1)

这对我有用:

$names = ['1'=>'John','2'=>'Patric','3'=>'Deny'];

答案 4 :(得分:1)

我在Ubuntu上用中文setlocale(LC_ALL, "zh_CN.UTF-8")和日语setlocale(LC_ALL, "ja_JP.UTF-8")解决了这个问题。

或者您也可以修改系统默认的语言环境信息。