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−BFFFD, C0 −CFFFD, D0000−DFFFD, E0000−EFFFD

最初不允许的字符范围

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