我想打印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
答案 0 :(得分:5)
\u
表示法(带有四个十六进制数字)表示UCS-2编码,即您只能编码BMP中的字符(基本多语言平面,基本上是U+00000
到U+0FFFF
)
U+1F50A
超出 BMP,因此不能以16位编码。 UTF-16为BMP之外的此类字符使用代理项对(0xD800
- 0xDFFF
范围内的值,这些值未在UCS-2中使用),但在\u
中明确禁止使用它们符号
您需要\U
符号(带八个十六进制数字)。
另请注意,从\u
或\U
表示法转换为字符串中实际结束的任何内容都依赖于语言环境,因此在一个平台上可能起作用的内容可能无法在另一个平台上运行...如果你想真的便携,确保,例如在字符串中使用UTF-8或UTF-16编码,您需要:
\x...
或八进制\...
手动执行编码; 虽然我们正在努力(并且因为很多人都没有意识到这一点),但上述内容直接指出了当您需要Unicode时,Microsoft的16位版wchar_t
被破坏的原因:它源于从那时 只有BMP,而16位UCS-2足够了。由于对所有已定义的Unicode字符进行编码已不再足够,因此您可以使用来保存UTF-16代码值,但wchar_t
- 和扩展名std::wstring
为以及L""
字符串文字 - 并不像名称所暗示的那样宽,但多字节充其量。
很好,C ++引入了显式char16_t
和char32_t
,加上与语言环境无关的u""
,U""
和u8""
字符串文字。太糟糕的MSVC还没有支持他们AFAIK。