C++23 现在是否在其基本
char
类型中提供对 Unicode 字符的支持,支持到什么程度?
所以字符文字的cppreference,字符文字:
'c-char'
定义为:
- a
basic-c-char
- 转义序列,如转义序列中所定义
- 通用字符名称,如转义序列中定义
然后对于
basic-c-char
,它的定义是:
基本源字符集(C++23 之前)翻译字符集(C++23 起)中的字符,单引号
、反斜杠'
或换行符除外\
在 cppreference 的字符集页面,它定义了“翻译字符集”,由以下内容组成:
- 每个抽象字符在 Unicode 代码空间中分配一个代码点,并且(C++23 起)
- 每个 Unicode 标量值的不同字符未分配给抽象字符。
并指出:
翻译字符集是基本字符集和基本文字字符集的超集(见下文)。
在我看来,“基本字符集”(在上一页给出)基本上是 ASCII 的子集。我也一直认为
char
就是 ASCII(支持 ISO-8859 字符集,例如每个 Microsoft 关于字符类型的页面)。但现在随着basic-c-char
翻译字符集的改变,似乎它在某种程度上支持了Unicode。
我知道实际的编码是实现定义的(除了空字符和递增的十进制数字字符之外)。但我的主要问题是这个“翻译字符集”真正支持哪些字符?都是Unicode吗?我觉得我读到的内容比实际情况要多。
这个“翻译字符集”真正支持哪些字符?
正如您已经引用的那样(我将引用最新的 C++ 标准草案):
[lex.charset]
翻译字符集由以下元素组成:
- 每个抽象字符在 Unicode 代码空间中分配一个代码点,并且
- 每个 Unicode 标量值的不同字符未分配给抽象字符。
让我们查找规则中使用的术语的定义(引自 Unicode 14):
第一点:
字符和编码
抽象特征:用于组织的信息单位, 控制,或文本数据的表示。
- 在表示数据时,该数据的性质通常是象征性的,而不是其他类型的数据(例如,听觉或 视觉的)。此类符号数据的示例包括字母、表意文字、 数字、标点符号、技术符号和标志。
- 抽象字符没有具体形式,不应与字形混淆。
- 抽象字符不一定对应于用户所认为的“字符”,并且不应与字素混淆。
- 由 Unicode 标准编码的抽象字符称为 Unicode 抽象字符。
- 不直接由 Unicode 标准编码的抽象字符通常可以通过使用组合字符序列来表示
第二点:
Unicode 编码形式
Unicode 标量值:除高代理和低代理代码点之外的任何 Unicode 代码点。
- 作为此定义的结果,Unicode 标量值集由 范围为 0 至 D7FF 16 和 E000 16 至 10FFFF 16(含)。
C++ 标准也有一个澄清说明:
[注1: Unicode 代码点是 [0, 10FFFF] 范围内的整数 (十六进制)。代理代码点是 [D800, DFFF](十六进制)。 Unicode 标量值是任何代码点 不是代理代码点。 — 尾注]
都是Unicode吗?
TLDR:不。例如。代理代码点和组合字符序列不在翻译字符集中。
附注C++ 标准从未禁止
char
文字中的 Unicode;此更改只是强制要求 Unicode 支持。