我一直在挖掘规范一段时间,找不到任何结论性条款来支持是/否。
以下声明:
char16_t *s = u"asdf";
暗示/强制字符串文字“asdf”必须以UTF-16编码?
从我可以推断的一切,这是肯定的。
但是,在此提案n2018中,只有当“__STDC_UTF_16__
”被定义为char16_t
文字是UTF-16编码时,它才会打开“{{{ 1}}“未定义,__STDC_UTF_16__
文字可以编码,无论编译器想要什么。
毕竟,标准只保证char16_t
的大小,有符号和基础表示,它没有提到编译器必须如何编码char16_t
文字或字符串文字。
在规范中,它说
char16_t
字符串文字的大小是转义的总数 序列,通用字符名称和其他字符,加上一个 对于需要代理对的每个角色,加上一个代理对 终止你'\ 0'。 [注意:char16_t
字符串文字的大小是 代码单元的数量,而不是字符数。 - 后注]
这似乎意味着隐含地假设char16_t
字符串文字是UTF16编码的,因为“代理对”是UTF-16概念。
如果问题中有任何含糊之处,请告诉我。
答案 0 :(得分:6)
__STDC_UTF_16__
位没有进入标准文本。提案中的内容可能是因为它来自类似的C语言提案。 C ++标准简单地删除了所有这些废话并使其成为UTF-16或GTFO。
答案 1 :(得分:5)
标准在技术上不受基础编码的限制,并且仅指定单个char16_t
的值必须对应于0~0xFFFF范围内的UCS代码点
§2.14.3
2以字母u开头的字符文字,例如u'y',是一个字母 char16_t类型的字符文字。 char16_t文字的值 包含单个c-char等于其ISO 10646代码点值, 只要代码点可以用一个16位表示 代码单元。
另一方面,字符串可以包括代理对
§2.14.5
10以u开头的字符串文字,例如u“asdf”,是一个char16_t 字符串字面量。 char16_t字符串文字的类型为“const of n const” char16_t“,其中n是下面定义的字符串的大小;它有 静态存储持续时间并使用给定的字符初始化。 单个c-char可能会产生多个char16_t字符 代理对的形式。
只有UTF-16符合这两项要求,尽管该标准为未来的兼容编码打开了大门,但不太可能。但/ / p>