在POSIX系统上使用通用字符有什么用?

时间:2013-09-01 14:10:17

标签: c unix unicode

在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系统上是否可行?

1 个答案:

答案 0 :(得分:3)

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