繁体   English   中英

C中的Unicode字符

[英]Unicode characters in C

C标准是否要求编译器能够处理未编码为ascii的文件? 特别是,我想知道utf-8文件是否符合标准。 上一个问题的答案在C89,C99和C11之间是否有所不同?

假设在C源文件中使用ASCII外部的字符是合法的,哪些用法合法?

我可以想到几个不同的用例:

  1. 在评论中
  2. 在字符串内
  3. 在标识符内
  4. 在宏名称内

这是一个显示所有四个的示例:

#ifdef PRINT_©
// Print out the © notice
cont char my©Notice[] = "This program is © 2016 ACME INC";
puts(my©Notice);
#endif

如果C允许非ASCII字符出现在上面列出的用法中,那么可能使用的代码点是否有任何限制?

请记住,这是关于C标准的问题。 我已经意识到将unicode字符放入标识符和宏将使代码更难以使用。

它的实现是定义的,因此不受标准的约束。

我知道至少有一个编译器,即clang ,它要求源是UTF-8。 但是其他编译器可能会使用其他要求,或者不允许它。

从C99开始,标识符允许包含多字节字符,但在C99之前,它将是允许非基本字符的扩展名。 C11扩展了允许的字符集。

对标识符中允许的字符有一些额外的限制,并且©不在列表中。 它在附录D中列出。这些是Unicode点,但这并不严格意味着文件中的编码必须是基于unicode的。

允许的字符范围

  • 00A8,00AA,00AD,00AF,00B2-00B5,00B7-00BA,00BC-00BE,00C0-00D6,00D8-00F6,00F8-00FF
  • 0100-167F,1681-180D,180F-1FFF
  • 200B-200D,202A-202E,203F-2040,2054,2060-206F
  • 2070-218F,2460-24FF,2776-2793,2C00-2DFF,2E80-2FFF
  • 3004-3007,3021-302F,3031-303F
  • 3040-D7FF
  • F900-FD3D,FD40-FDCF,FDF0-FE44,FE47-FFFD
  • 10000-1FFFD,20000-2FFFD,30000-3FFFD,40000-4FFFD,50000-5FFFD,60000-6FFFD,70000-7FFFD,80000-8FFFD,90000-9FFFD,A0000-AFFFD,B0000-BFFFD,C0000-CFFFD,D0000- DFFFD,E0000-EFFFD

最初不允许使用字符范围

  • 0300-036F,1DC0-1DFF,20D0-20FF,FE20-FE2F

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM