可以用C++编译器规范化Unicode标识符吗?

Adr*_*thy 5 c++ unicode language-lawyer canonicalization unicode-normalization

在C++中,我们可以在标识符中使用各种Unicode字符.例如,您可以命名变量résumé.

那些带有重音的es可以用不同的方式表示:作为预组合字符或作为e具有组合重音字符的普通字符.许多应用程序规范化这些字符串,以便看似相同的字符串实际匹配.

看看C++标准,我没有看到任何需要编译器规范化标识符的东西,因此变量résumé可能与变量不同re?sume?.(在我的测试中,似乎并不像MSVC或clang标准化标识符.)

是否有任何禁止编译器选择正常形式的东西?如果不是,在翻译的哪个阶段应该进行规范化?

[要明确:我在谈论标识符,而不是字符串文字.]

Bri*_*ian 5

我相信允许编译器在转换阶段1中执行此规范化:

如果需要,物理源文件字符以实现定义的方式映射到基本源字符集(引入行尾指示符的换行符).接受的物理源文件字符集是实现定义的.不在基本源字符集(5.3)中的任何源文件字符将替换为指定该字符的通用字符名称.实现可以使用任何内部编码,只要在源文件中遇到实际的扩展字符,并且在源文件中表示为与通用字符名称相同的扩展字符 (例如,使用\uXXXX符号),将被等效地处理,除非在原始字符串文字中还原此替换(5.4)的位置.

由于源文件字符到基本源字符集和通用字符名称的映射是实现定义的,因此实现可以选择将任何字节序列转换为相同的预编译或分解的小写e-with-acute-accent.通用字符名称,但必须记录此选择.