【问题标题】:How do I codify the unicode point U+10000 in a char16_t string literal?如何在 char16_t 字符串文字中编码 unicode 点 U+10000?
【发布时间】:2013-07-02 16:24:27
【问题描述】:

C++11 标准中的第 2.14.5p9 段说(强调我的):

以 u 开头的字符串文字,例如 u"asdf",是 char16_t 字符串字面量。 char16_t 字符串文字的类型为“n const 数组 char16_t”,其中 n 是字符串的大小,定义如下;它有 静态存储持续时间,并使用给定的字符进行初始化。 单个 c-char 可能会在 代理对的形式

如何编码 unicode 点 U+10000,它由 char16_t 字符串文字中的代理对 D800(高代理)和 DC00(低代理)组成?

上面引用文字中提到的c-char是什么意思?

【问题讨论】:

  • 如果你想明确指定代码单元,你也可以写char16_t s[] = {0xD800, 0xDC00, 0}

标签: c++ unicode c++11


【解决方案1】:

其实很简单:u"\U00010000"。如文中所述,单个c-char(在本例中为\U00010000)可以产生多个char16_t。快速测试会发现u"\U00010000" 的类型是char16_t const[3](2 代表代理对 + 1 代表空终止符)。

或者,您可以简单地将字符直接放入字符串中,如u"?",假设源文件以编译器期望的编码保存。这将是完全相同的事情,因为对源文件执行的第一步是将基本字符集之外的任何字符替换为其通用字符名称(即\U00010000)。

c-char 是“源字符集的任何成员,除了单引号 '、反斜杠 \ 或换行符”,或 转义-sequence(如\n,或\123,或\x41),或一个通用字符名(如\u1234\U12345678)。 p>

标准文档的末尾有一个语法产生式索引,您可以使用它来查找这些内容。

【讨论】:

  • 奇怪,但这个:int main() { const char16_t* p = u"\U00010000"; } 在 VS2010 中无法编译。
  • AFAIK VS2010 对此没有完全支持。适用于 GCC,例如:coliru.stacked-crooked.com/…
猜你喜欢
  • 2015-03-15
  • 2010-11-06
  • 2017-02-20
  • 2022-11-11
  • 2016-07-06
  • 1970-01-01
  • 2019-05-30
  • 2014-05-11
  • 2021-06-01
相关资源
最近更新 更多