问题描述
|
我在新的C ++标准中找到了
2.11 Identifiers [lex.name]
identifier:
identifier-nondigit
identifier identifier-nondigit
identifier digit
identifier-nondigit:
nondigit
universal-character-name
other implementation-defined character
与其他文字
标识符是字母和数字的任意长序列。标识符中的每个通用字符名称应指定一个字符,其字符在ISO 10646中的编码属于指定的范围之一
在E.1。 [...]
我不太理解这是什么意思。从旧的标准输入法开始,我习惯于将“通用字符名称”写为“ 1”。但是在标识符中使用那些...?真?
新标准对Unicode开放了吗?而且我没有提到新的文字类型\"uHello \\u89ab thing\"u32
,我认为我理解这些。但:
(便携式)源代码可以采用任何Unicode编码,例如UTF-8,UTF-16或任何(无论如何定义)代码页吗?
我可以在其中写myfu\\u1234ntion
的标识符吗(出于任何目的)
或者我可以使用Unicode定义的\“字符名称\”,如ICU中那样。
const auto x = \"German Braunb\\U{LOWERCASE LETTER A WITH DIARESIS}r.\"u32;
甚至在源代码本身的标识符中?那会是一种享受...咳嗽...
我认为所有这些问题的答案都是“否”,但我不能可靠地将其映射到标准中的措辞... :-)
编辑:我发现\“ 2.2翻译阶段[lex.phases] \”,阶段1:
必要时,以实现定义的方式将物理源文件字符映射到基本源字符集。接受的物理源文件字符集是实现定义的。 [...]基本文件中没有的任何源文件字符
源字符集(2.3)替换为指定该字符的通用字符名称。 (一个实现可以使用任何内部编码,只要在源文件中遇到了实际的扩展字符,并且在源文件中以通用字符名表示相同的扩展字符(即,使用\\ uXXXX表示),等同地处理,除非此替换以原始字符串文字形式还原。)
通过阅读本文,我现在认为,编译器可以选择接受UTF-8,UTF-16或希望的任何代码页(通过元信息或用户配置)。在阶段1中,它将其转换为ASCII格式(\“基本源字符集\”),然后用\\uNNNN
表示法替换Unicode字符(或者编译器可以选择继续以Unicode表示法工作,因此必须确保它以相同的方式处理其他“ 6”。
你怎么看?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)