我想在C源代码中打印Unicode字符"扬声器与三声波"(U + 1F50A)编码"\ uD83D\uDD0A",但得到此输出:
error: \uDD0A is not a valid universal character
error: \uD83D is not a valid universal character
Run Code Online (Sandbox Code Playgroud)
\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...或八进制手动编码\...;虽然我们是在它(因为很多人都没有意识到这一点),以上几点连胜为什么微软的16位版本wchar_t,当你想的Unicode坏:它从当有一个时间的茎是只有BMP,和16位UCS- 2足够了.由于对所有已定义的Unicode字符进行编码已经不够了,您可以使用它来保存UTF-16代码值,但是wchar_t- 并且通过扩展,std::wstring以及L""字符串文字 - 并不像名称所暗示的那样宽,但是多字节充其量.
好事,C++引入明确的char16_t和char32_t,再加上语言环境无关u"",U""和u8""字符串文字.太糟糕的MSVC还不支持他们AFAIK.