gpt4 book ai didi

c - c源代码中的Unicode字符 'SPEAKER WITH THREE SOUND WAVES'(U+1F50A)

转载 作者:太空宇宙 更新时间:2023-11-04 01:05:06 24 4
gpt4 key购买 nike

我想在 C 源代码中打印 Unicode 字符 'SPEAKER WITH TREE SOUND WAVES' (U+1F50A) Encodings "\uD83D\uDD0A"但得到这个输出:

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

最佳答案

\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 支持的第三方库 (ICU)。

虽然我们在做这件事(因为很多人都不知道这一点),但上面的内容直接说明了为什么当您需要 Unicode 时 Microsoft 的 16 位版本的 wchar_t 被破坏了:它源于一个时间当只有 BMP 时, 和 16 位 UCS-2 就足够了。由于对所有定义的 Unicode 字符进行编码已经不够了,您可以使用它来保存 UTF-16 代码值,但是 wchar_t —— 并且通过扩展, std::wstring 以及 L"" 字符串字面量——并不是真正的wide 顾名思义,而是多字节 充其量。

很好,C++ 引入了显式 char16_tchar32_t,加上与语言环境无关的 u""U""u8"" 字符串文字。可惜 MSVC 还不支持它们 AFAIK。

关于c - c源代码中的Unicode字符 'SPEAKER WITH THREE SOUND WAVES'(U+1F50A),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25552203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com