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