C语言的Unicode Hello World怎么写?

10

我正尝试从C输出像安、蠀、☃这样的东西。

#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上是否可以运行?


你是用Windows还是Linux? - Zifre
我的电脑出了点问题,因为我在代码示例中也看到了那些问号! - alvatar
4
尝试将编码设置为Unicode(UTF-8)(在Firefox中,查看->字符编码)。 - Lucas Jones
2
我在韩语中看到了“ang”,在中文中看到了“ci”,还有一个雪人。这不是任何一种语言中的“hello world”。 - CookieOfFortune
您的编辑(包含setlocale一行)在我使用的Mac OS X上,在苹果的Terminal.app和urxvt下都能工作; 我的LANG=en_US.UTF-8。有可能是您没有安装包含中文字符和雪人的字体。 - Brian Campbell
utf8everywhere.org 将教您如何在 Windows 上处理文本。 - Pavel Radzivilovsky
5个回答

9

您需要将输出终端设置为与Unicode兼容。

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

$ LANG=en.UTF-8

并确保您的终端仿真器能够显示Unicode并已配置为显示Unicode。


6
在获取Unicode输出的过程中有许多个人阶段,所有这些阶段都必须正确配置。
首先,您是否启用了Unicode支持进行编译?在Windows下需要这样做(-D UNICODE -D __UNICODE)。
其次,您是否将其发射到支持Unicode的命令行中,无论是原则上还是拥有包含您正在发射的字符字形的字体?
第三,您的编译器和命令行使用的Unicode编码是否匹配?如果您的命令行期望UTF8,则在二进制文件中使用UCS2是没有用的。
基本上,您需要真正理解Unicode及其编码才能做到这一点。不要想象这很简单或者您不需要学习所有基础概念;这种东西不能偶然发生,因为有太多的事情必须完全正确。

4

C中的wchar_t定义如下:

类型wchar_t是一个独特的类型,其值可以表示所有支持语言环境(22.1.1)中最大扩展字符集的所有成员的不同代码。[...]

多字节字符与wchar_t之间的区别:

多字节字符可能需要根据编码(例如:UTF-8、UTF-16)为给定字符使用多个字节。

wchar_t具有固定大小,即wchar_tsizeof是由实现定义的。请注意,此宽度定义了您的wchar_t可以支持哪些编码。因此,如果sizeof(wchar_t)==2,则无法使用UTF-32编码。

还要记住,wchar_t本身没有编码意义。您必须首先告诉编译器要使用什么样的编码来处理wchar_t数据。错误输出很可能是因为字符正在以默认编码进行处理,该编码无法正确支持这些字符,并且匹配失败导致“notdef”样式的“?”输出。


wchar_t并不一定是多字节的 - 它可以是一个字节长。 - user82238
嗯,是的,我应该更加严谨一些 :-) - dirkgently

1

您需要配置您的系统以接受这些字符。您使用的是什么操作系统?Windows,Linux?


我正在使用 Linux。$ locale 全部设置为 en_US.utf8 - numeric

0
正如Alnitak所建议的那样,必须指定一个包含要显示的字符的字符集/编码的区域设置。 (Unicode/)UTF-8应该涵盖所有Unicode字符。
您的终端应使用具有相应字形的字体。
Windows的CMD.EXE在超过8位的字符集方面非常薄弱。也许,您需要一个GUI窗格而不是依赖于stdout。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接