C++23:翻译字符集抽象字符与Unicode标量值差异及断言问题
C++翻译字符集与Unicode标量值的差异问题
问题场景
考虑以下十六进制表示的字节序列(第二列为ASCII释义,仅供参考):
0x73 s 0x74 t 0x61 a 0x74 t 0x69 i 0x63 c 0x5f _ 0x61 a 0x73 s 0x73 s 0x65 e 0x72 r 0x74 t 0x28 ( 0x55 U 0x27 ' 0xe2 0x84 0xab 0x27 ' 0x3d = 0x3d = 0x55 U 0x27 ' 0xc3 0x85 0x27 ' 0x29 ) 0x3b ;
该字节序列以UTF-8解码后得到如下代码:
static_assert(U'Å'==U'Å');
注意两个Å对应的Unicode标量值存在差异:
- 左侧
Å:0x212B ANGSTROM SIGN - 右侧
Å:0x00C5 LATIN CAPITAL LETTER A WITH RING ABOVE
核心疑问:当源文件采用C++23强制支持的UTF-8编码时,这个static_assert是否应当失败?
标准分析与衍生疑问
在C翻译阶段1,UTF-8序列会被解码为Unicode标量值序列,随后这些标量值会被映射到翻译字符集的元素,形成翻译字符集元素序列(参考C标准[lex.phases]/1.1条款)。根据[lex.charset]/1.1条款,除未分配的标量值外,翻译字符集的元素是拥有已分配Unicode码点的抽象字符。
目前最接近的抽象字符定义来自Unicode标准第3.4章的D11:一个抽象字符可对应多个码点,且恰好以Å作为示例(注:原文仅说明“对应”关系,未提及“分配”)。
由此引申出以下问题:
- 若C++标准采用Unicode的抽象字符定义,翻译字符集中是否仅存在一个对应
0x212B和0x00C5的抽象字符元素? - 如果是这样,两个字符字面量的值是否会因为源于同一翻译字符集元素而相等,导致断言意外通过?这显然不符合直观预期。
- Unicode是否提供了完整的“码点-同一抽象字符”对应关系的官方信息?
- C++标准中所指的抽象字符具体定义是什么?
内容的提问来源于stack exchange,提问作者user17732522
相关产品推荐
相关产品推荐

