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

9

我已经研究了一段时间的规范文件,但没有找到任何明确的条款来支持是或否。

以下陈述是否有效:

char16_t *s = u"asdf";

这意味着/强制要求字符串字面量 "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字符串字面量的大小是代码单元的数量,而不是字符的数量。 —end note]

这似乎意味着假定char16_t字符串字面量是UTF16编码,因为“代理对”是UTF-16的概念。

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

2个回答

7

__STDC_UTF_16__这个标志并没有被写入标准文本中。它在提案中可能是因为从C语言的类似提案中借鉴而来。C++标准只保留了UTF-16编码,将其它编码一律删除。


5
有关_GTFO_规范的权威来源吗?还是说这是非规范性的? - sehe
3
§1.1/1 [intro.scope]:“本国际标准规定了C++编程语言的实现要求。首要要求是实现该语言,因此本国际标准还定义了C++。其他要求和对首要要求的放宽出现在本国际标准的各个地方。” - R. Martinho Fernandes

6
标准技术上不关心底层编码,只规定单个char16_t的值必须对应于UCS代码点范围内的0~0xFFFF。以字母u开头的字符字面量(例如u'y')是char16_t类型的字符字面量。包含单个c-char的char16_t字面量的值等于其ISO 10646代码点值,前提是该代码点可以用单个16位代码单元表示。另一方面,字符串可以包括代理对。以u开头的字符串字面量(例如u"asdf")是char16_t字符串字面量。char16_t字符串字面量的类型为“n个const char16_t的数组”,其中n是如下所定义的字符串的大小;它具有静态存储期,并使用给定的字符进行初始化。一个单一的c-char可能会产生多个char16_t字符,形成代理对。只有UTF-16符合这两个要求,尽管标准为未来兼容编码敞开了大门,但这种情况可能性极小。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接