C 什么';POSIX系统上通用字符的使用是什么?
在C中,可以将unicode字符传递给printf(),如下所示:C 什么';POSIX系统上通用字符的使用是什么?,c,unix,unicode,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"); %的占位符将自动展开,并在终端上打印unicode字符。此外,在一个标
printf("some unicode char: %c\n", "\u00B1");
但问题是,在POSIX兼容系统上,“char”总是8位,而且上面提到的大多数UTF-8字符都比较宽,不适合char,因此终端上不会打印任何内容。但是,我可以这样做以实现此效果:
printf("some unicode char: %s\n", "\u00B1");
%的占位符将自动展开,并在终端上打印unicode字符。此外,在一个标准中,它说:
如果通用字符名的十六进制值小于
0x20或在0x7F-0x9F(含)范围内,或如果通用
字符名称指定基本源字符中的字符
设置,则程序的格式不正确
当我这样做时:
printf("letter a: %c\n", "\u0061");
gcc表示:
错误:\u0061不是有效的通用字符
因此,这种技术也不能用于打印ASCII字符。维基百科上的这篇文章说:
C编程语言中的字符是一种大小为的数据类型
正好是一个字节,而这个字节又被定义为足够大,可以
包含基本执行字符集的任何成员和UTF-8代码
单位
但是这在POSIX系统上可行吗?在基于字节的字符串中使用通用字符取决于编译时和运行时字符编码的匹配,因此除了在某些情况下,通常不是一个好主意。但是,它们在宽字符串和宽字符文本中工作得非常好:
printf(“%ls”,L“\u00B1”)代码>或printf(“%lc”,L'\00B1')
将按您所在地区的正确编码打印U+00B1。导致printf(“%c”,““…”)
不起作用的一个很好的原因是%c
告诉printf需要一个字符,“…”具有类型字符*
。这使得你很难理解你在问什么。它在任何情况下都无法工作。printf(“某些unicode字符:%c\n”,“\u00B1”)代码>与%c一起使用时不应该使用“\u00B1”而不是“\u00B”@Pascal Cuoq:哦,是的,我不知道。但是根据维基百科的文章,人们可以在一个字符中打印一个unicode字符。如何使用Unicode转义序列执行此操作?为什么这样做:printf(“unicode字符:%c\n”,“±”);当我这样做时,这个程序会编译,但gcc会显示“多字符字符常量”警告,并在终端中只打印一个问号。我还认为它应该打印一个unicode单个字符,但它没有:(printf(“一些unicode字符:%c\n”,“u00B1”);
不应该工作。您正在打印一个字符串(char*
),就好像它是一个char
)。