Unicode字符'发声器有三个声音波' (U + 1F50A)c源代码

时间:2014-08-28 15:08:07

标签: c unicode

我想打印Unicode Character' SPEAKER WITH THREE SOUND WAVES' (U + 1F50A)编码" \ uD83D \ uDD0A"在C源代码中,但获得此输出:

error: \uDD0A is not a valid universal character
error: \uD83D is not a valid universal character

1 个答案:

答案 0 :(得分:5)

\u表示法(带有四个十六进制数字)表示UCS-2编码,即您只能编码BMP中的字符(基本多语言平面,基本上是U+00000U+0FFFF

U+1F50A 超出 BMP,因此不能以16位编码。 UTF-16为BMP之外的此类字符使用代理项对(0xD800 - 0xDFFF范围内的值,这些值未在UCS-2中使用),但在\u中明确禁止使用它们符号

您需要\U符号(带八个十六进制数字)。

另请注意,从\u\U表示法转换为字符串中实际结束的任何内容都依赖于语言环境,因此在一个平台上可能起作用的内容可能无法在另一个平台上运行...如果你想真的便携,确保,例如在字符串中使用UTF-8或UTF-16编码,您需要:

  • 通过十六进制\x...或八进制\...手动执行编码;
  • 使用正确 Unicode支持(ICU)的第三方库。

虽然我们正在努力(并且因为很多人都没有意识到这一点),但上述内容直接指出了当您需要Unicode时,Microsoft的16位版wchar_t被破坏的原因:它源于从那时 只有BMP,而16位UCS-2足够了。由于对所有已定义的Unicode字符进行编码已不再足够,因此您可以使用来保存UTF-16代码值,但wchar_t - 和扩展名std::wstring为以及L""字符串文字 - 并不像名称所暗示的那样,但多字节充其量。

很好,C ++引入了显式char16_tchar32_t,加上与语言环境无关的u""U""u8""字符串文字。太糟糕的MSVC还没有支持他们AFAIK。