如何在C中打印中文或日文字符(非英文)?
wchar *wc = (wchar *)calloc(50,sizeof(wchar*));
wcscpy(wc ,L"john 麥克風");
printf(" wc : %S \n",wc);
我的输出中只有john
。
答案 0 :(得分:4)
软件不了解"字符"。所有它知道的数字恰好被解释作为字符,无论其他软件实际显示你的输出。 (对于您的软件,a
仅仅是0x61的别名。将0x61转换为识别为a
的像素组合取决于终端,GUI或其他任何内容。)
源中非ASCII字符的处理是实现定义的,即由编译器决定如何处理源中的中文字符。如果您想要安全(和便携)播放,则必须使用其编码值编写非ASCII字符,例如:使用\x
表示法。 (或者较新的\u
,但这并没有明确地说明它已明确引用Unicode。)
此时你应该知道你必须同意你的程序关于你正在使用的编码,否则你的数值意味着你的程序完全不同。这是通过适当设置区域设置来完成的。 (编码ISO-8859-1和ISO-8859-15以及EBCDIC和...用于单字节,UTF-8和UTF-16以及EUC和ISO-2022-JP和...用于多字节,UCS-2和UTF-32以及其他可能广泛的......虽然所有应该是Unicode恕我直言,但它显然不是,即使没有外来物,也有三种截然不同的Unicode编码在那里。)
正如其他人已经指出的那样,如果你正在做什么"宽"输出,你应该使用" wide"输出功能。 (请注意"多字节" 还完全是另一种类型的鱼,并且有8位多字节编码 - UTF-8 - 以及16位多字节编码 - UTF16 ......)
无论您打印输出到(例如终端,GUI)都需要支持您的区域设置/编码,并且需要在其中添加字体实际上具有为相关代码点加载的字形(即可打印字符)的处理。 (否则你会得到"?",其他一些占位符,或者其中包含微小十六进制代码的一些有趣的东西。)
虽然您的实际问题很可能取决于使用printf()
而不是wprintf()
,但上述所有要点必须协同工作才能正确打印非ASCII字符。因此,您可能也有其他问题,但很难说。
答案 1 :(得分:2)
这是一个宽字符串,因此您需要wprintf:
答案 2 :(得分:1)
确保终端使用UTF-8编码。 C ++本身是unicode不可知的。您还需要使用std::wcout
或wprintf
来打印这些内容。
答案 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")
解决了这个问题。
或者您也可以修改系统默认的语言环境信息。