1

在 C 中,可以像这样将 unicode 字符传递给 printf():

printf("some unicode char: %c\n", "\u00B1");

但问题是,在 POSIX 兼容系统上,'char' 始终是 8 位,并且大多数 UTF-8 字符(如上述)更宽,不适合 char,因此终端上没有打印任何内容。我可以这样做来实现这种效果:

printf("some unicode char: %s\n", "\u00B1");

%s 占位符自动展开,并在终端上打印一个 unicode 字符。此外,在标准中它说:

如果通用字符名称的十六进制值小于 0x20 或在 0x7F-0x9F(含)范围内,或者通用字符名称指定了基本源字符集中的字符,则程序格式错误。

当我这样做时:

printf("letter a: %c\n", "\u0061");

gcc 说:

错误:\u0061 不是有效的通用字符

所以这种技术也不能用于打印 ASCII 字符。在维基百科上的这篇文章http://en.wikipedia.org/wiki/Character_(computing)#cite_ref-3中它说:

C 编程语言中的 char 是一种大小正好为一个字节的数据类型,它又被定义为足够大以包含基本执行字符集和 UTF-8 代码单元的任何成员。

但这在 POSIX 系统上可行吗?

4

1 回答 1

3

在基于字节的字符串中使用通用字符取决于编译时和运行时字符编码的匹配,因此除非在某些情况下,否则通常不是一个好主意。然而,它们在宽字符串和宽字符文字中工作得非常好:printf("%ls", L"\u00B1");或者printf("%lc", L'\00B1');将以适合您的语言环境的正确编码打印 U+00B1。

于 2013-09-01T14:56:44.090 回答