首页 > 解决方案 > C++ 编译器可以规范化 Unicode 标识符吗?

问题描述

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

这些带重音e的 s 可以用不同的方式表示:作为预组合字符或作为e带有组合重音字符的普通字符。许多应用程序对此类字符串进行规范化,以便看似相同的字符串实际上匹配。

查看 C++ 标准,我看不到任何需要编译器规范化标识符的东西,因此 variablerésumé可能与 variable 不同résumé。(在我的测试中,似乎 MSVC 和 clang 都没有规范化标识符。)

有什么禁止编译器选择正常形式的吗?如果不是,规范化应该发生在翻译的哪个阶段?

[要清楚:我说的是标识符,而不是字符串文字。]

标签: c++unicodelanguage-lawyerunicode-normalizationcanonicalization

解决方案


我相信编译器被允许在翻译阶段 1 中执行这种规范化:

如有必要,物理源文件字符以实现定义的方式映射到基本源字符集(为行尾指示符引入换行符)。接受的物理源文件字符集是实现定义的。任何不在基本源字符集 (5.3) 中的源文件字符都将替换为指定该字符的通用字符名。一个实现可以使用任何内部编码,只要在源文件中遇到的实际扩展字符,以及在源文件中表示为通用字符名称 (例如,使用\uXXXX符号)的相同扩展字符被等效处理,除了在原始字符串文字中恢复此替换(5.4)。

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


推荐阅读