unicode hello world for C?

时间:2009-04-24 21:09:58

标签: c unicode utf-8

我想从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?

5 个答案:

答案 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窗格而不是依赖于标准输出。