请注意前面的句子,其中指出:
如有必要,物理源文件字符以实现定义的方式映射到基本源字符集(为行尾指示符引入换行符)。
也就是说,编译器如何实际解释构成文件的字符或字节完全取决于编译器。在进行这种解释时,它必须决定哪些物理字符属于基本源字符集,哪些不属于。如果一个角色不属于,则将其替换为通用角色名称(或者至少,效果就像它已经完成一样)。
这样做的目的是将源文件减少到一个非常小的字符集——基本源字符集中只有 96 个字符。任何不在基本源字符集中的字符都已替换为\
、u
或U
以及一些十六进制数字 ( 0
- F
)。
通用字符名称是以下之一:
\uNNNN
\UNNNNNNNN
其中每个N
都是十六进制数字。这些数字的含义在 §2.3 中给出:
由universal-character-name 指定的字符\UNNNNNNNN
是ISO/IEC 10646 中字符短名称为的字符NNNNNNNN
;Universal-character-name 指定的字符\uNNNN
是 ISO/IEC 10646 中字符短名称为 的字符0000NNNN
。如果通用字符名称的十六进制值对应于代理代码点(在0xD800
-<code>0xDFFF 范围内,包括在内),则程序格式错误。
ISO/IEC 10646 标准起源于 Unicode 之前并定义了通用字符集 (UCS)。它将代码点分配给字符并指定这些代码点应如何编码。Unicode 联盟和 ISO 小组随后联手致力于 Unicode。Unicode 标准比 ISO/IEC 10646 规定的要多得多(算法、功能字符规范等),但现在这两个标准保持同步。
因此,您可以将NNNN
orNNNNNNNN
视为该字符的 Unicode 代码点。
例如,考虑源文件中包含以下内容的一行:
const char* str = "Hellô";
由于 ô 不在基本源字符集中,因此该行在内部被翻译为:
const char* str = "Hell\u00F4";
这将给出相同的结果。
您的代码中只有某些部分允许使用通用字符名称: