c++ - C++ 编译器可以规范化 Unicode 标识符吗?
问题描述
在 C++ 中,我们可以在标识符中使用各种 Unicode 字符。例如,您可以命名一个变量résumé
。
这些带重音e
的 s 可以用不同的方式表示:作为预组合字符或作为e
带有组合重音字符的普通字符。许多应用程序对此类字符串进行规范化,以便看似相同的字符串实际上匹配。
查看 C++ 标准,我看不到任何需要编译器规范化标识符的东西,因此 variablerésumé
可能与 variable 不同résumé
。(在我的测试中,似乎 MSVC 和 clang 都没有规范化标识符。)
有什么禁止编译器选择正常形式的吗?如果不是,规范化应该发生在翻译的哪个阶段?
[要清楚:我说的是标识符,而不是字符串文字。]
解决方案
我相信编译器被允许在翻译阶段 1 中执行这种规范化:
如有必要,物理源文件字符以实现定义的方式映射到基本源字符集(为行尾指示符引入换行符)。接受的物理源文件字符集是实现定义的。任何不在基本源字符集 (5.3) 中的源文件字符都将替换为指定该字符的通用字符名。一个实现可以使用任何内部编码,只要在源文件中遇到的实际扩展字符,以及在源文件中表示为通用字符名称 (例如,使用
\uXXXX
符号)的相同扩展字符被等效处理,除了在原始字符串文字中恢复此替换(5.4)。
由于源文件字符到基本源字符集和通用字符名称的映射是实现定义的,因此实现可以选择将表示预先组合或分解的小写字母 e-with-acute-accent 的任何字节序列转换为相同的通用字符名称,但必须记录此选择。
推荐阅读
- amazon-web-services - 这两个代码片段有什么区别?
- docker - 为什么用“不权威”响应我的 heroku 托管容器应用程序
- javascript - Puppeteer 循环遍历 URL 数组以访问下一页不起作用
- haskell - Haskell:Uncurry,Curry,作曲
- podman - Podman Play 不拉取 localhost 镜像:Get "https://localhost/v2/": dial tcp [::1]:443: connect: connection denied
- java - 需要帮助在我的 java 程序中集成一个 while 循环。希望程序更好地处理错误输入
- java - AlarmManager setInexactRepeating 在指定的触发时间之前触发
- java - 修复算法的执行时间
- android - Android WebRTC 应用程序无法在对等点之间建立连接
- javascript - testcafe 高阶选择器