我想从C
输出像안,蠀,things这样的东西#include <wchar.h>
int main()
{
fwprintf(stdout, L"안, 蠀, ☃\n");
return 0;
}
输出是?,?,?
如何打印这些字符?
编辑:
#include <wchar.h>
#include <locale.h>
int main()
{
setlocale(LC_CTYPE, "");
fwprintf(stdout, L"안, 蠀, ☃\n");
return 0;
}
这就是诀窍。输出是안,蠀,☃。除了中文字符和雪人在我的urxvt中显示为框,可能是因为我没有启用这些区域设置。
$ locale -a
C
en_US
en_US.iso88591
en_US.iso885915
en_US.utf8
ja_JP.utf8
ko_KR
ko_KR.euckr
ko_KR.utf8
korean
korean.euc
POSIX
zh_CN.utf8
我必须另外启用哪个区域设置才能显示中文字符和雪人?也许我需要字体?
以上程序是否适用于Windows?
答案 0 :(得分:9)
您必须将输出终端设置为Unicode兼容。
在Linux(使用Bash shell)上,尝试:
$ LANG=en.UTF-8
并确保您的终端仿真器可以实际显示Unicode并配置为执行此操作。
答案 1 :(得分:6)
获取Unicode输出的过程中有许多单独的阶段 - 所有这些阶段都必须正确配置。
首先,您是否在启用unicode支持的情况下进行编译?你需要在Windows下执行此操作(-D UNICODE -D __UNICODE)。
其次,您是否正在向支持unicode的命令行发送,原则上这两个字体还包含一个包含您正在发出的字符的字形的字体?
第三,编译器和命令行使用的unicode编码是否匹配?当您的命令行期望UTF8时,在二进制文件中使用UCS2是没有用的。
你基本上需要真正理解Unicode及其编码,才能做到这一点。不要想象它是直截了当的,或者你不需要学习所有基本概念;这些东西不会偶然起作用,因为有太多东西必须完全正确。
答案 2 :(得分:4)
C wchar_t
定义为:
类型
wchar_t
是一种不同的类型,其值可以表示支持的语言环境(22.1.1)中指定的最大扩展字符集的所有成员的不同代码。 [...]
多字节字符与wchar_t
之间的区别:
对于给定字符,多字节字符可能需要多个字节,具体取决于编码(例如:UTF-8,UTF-16)
,而
wchar_t
具有固定大小,即sizeof(wchar_t),它是实现定义的。请注意,此宽度定义了wchar_t
可以支持的编码。因此,如果sizeof(wchar_t) == 2
您无法使用UTF-32编码。
还要记住wchar_t
本身没有编码感。首先,您必须告诉编译器它必须为wchar_t
数据使用哪种编码。错误的输出很可能是因为正在使用默认编码处理字符,这些字符不能正确支持这些字符,失败的匹配会导致'notdef'样式'?'输出
答案 3 :(得分:1)
您必须将系统配置为接受这些字符。你在用什么? Windows,Linux?
答案 4 :(得分:0)
正如Alnitak建议的那样,必须指定一个包含要显示的字符的字符集/编码的语言环境。 (Unicode /)UTF-8应涵盖所有Unicode字符。
您的终端应使用具有各自字形的字体。
Windows'CMD.EXE在超过8位的字符集方面是出了名的弱。也许,您需要一个GUI窗格而不是依赖于标准输出。