unicode你好世界的C?

我想从C输出像안,蠀,things这样的东西

#include  int main() { fwprintf(stdout, L"안, 蠀, ☃\n"); return 0; } 

输出是?,?,?

如何打印这些字符?

编辑:

 #include  #include  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上运行吗?

您必须将输出终端设置为Unicode兼容。

在Linux(使用Bash shell)上,尝试:

 $ LANG=en.UTF-8 

并确保您的终端仿真器实际上可以显示Unicode并配置为执行此操作。

获取Unicode输出的过程中有许多单独的阶段 – 所有这些阶段都必须正确配置。

首先,您是否在启用unicode支持的情况下进行编译? 你需要在Windows下执行此操作(-D UNICODE -D __UNICODE)。

第二,你是否发出了一个支持unicode的命令行,原则上它们都有一个包含你正在发出的字符的字形的字体?

第三,编译器和命令行使用的unicode编码是否匹配? 当您的命令行期望UTF8时,在二进制文件中使用UCS2是没有用的。

你基本上需要真正理解Unicode及其编码,才能做到这一点。 不要想象它是直截了当的,或者你不需要学习所有基本概念; 这些东西不会偶然发生,因为太多的东西必须完全正确。

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’样式’?’ 输出。

您必须将系统配置为接受这些字符。 你在用什么? Windows,Linux?

正如Alnitak建议的那样,必须指定一个包含要显示的字符的字符集/编码的语言环境。 (Unicode /)UTF-8应涵盖所有Unicode字符。

您的终端应使用具有各自字形的字体。

Windows’CMD.EXE在超过8位的字符集方面是出了名的弱。 也许,您需要一个GUI窗格而不是依赖于stdout。