char16_t字符串必须使用UTF-16编码吗?

时间:2014-04-01 04:08:40

标签: c++ c++11 encoding utf-8

我一直在挖掘规范一段时间,找不到任何结论性条款来支持是/否。

以下声明:

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概念。

如果问题中有任何含糊之处,请告诉我。

2 个答案:

答案 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>