为char16_t指定基本多语言平面之外的字符文字代码点

时间:2014-09-05 20:01:54

标签: c++ unicode language-lawyer utf-16 string-literals

在我今天早些时候看过的关于Unicode的一次演讲中,当你试图分配一个太长而无法用char16_t类型表示的字符文字时,会发生什么样的混淆。主持人表示,基于对标准的阅读,该程序应该是格式错误的,但gcc无论如何都会接受它。他没有澄清,Youtube不允许我提问。

我自己的测试证实g ++ - 4.8和g ++ - 4.9接受以下代码。 (有警告。)

int main() {
  char16_t a = u'\U0001F378';
}

http://coliru.stacked-crooked.com/a/6cb2206660407a8d
https://eval.in/188979

另一方面,clang 3.4会产生错误。

哪个编译器正确?我找不到这一章和经文。

另外一个小问题,字符文字部分§2.14.3没有提到W语法或部分正文中的\u\U转义序列。这是疏忽吗?

1 个答案:

答案 0 :(得分:3)

该程序格式不正确,无法编译。

  

2.14.3 / 2 以字母u开头的字符文字,例如u'y',是char16_t类型的字符文字。该   包含单个c-char的char16_t文字的值等于其ISO 10646代码点值,前提是这样   代码点可用单个16位代码单元表示。 (也就是说,只要它是基本的多语言   平面代码点。)如果该值在16位内无法表示,程序格式错误 ......

强调我的。

\u\U不是 2.14.3 含义内的转义序列。它们是通用角色名称,在 2.3 / 2 中描述。它们不仅限于字符和字符串文字,但可能显示为anywhere in the program

int main() {
    int \u0410 = 42;
    return \u0410;
}

\u0410A,又名Cyrillic Capital Letter A.