【问题标题】:Multiple 16-bit character encodings to a 32-bit UChar多个 16 位字符编码为 32 位 UChar
【发布时间】:2022-01-25 14:09:03
【问题描述】:

我在这里阅读了几个答案,描述了如何将单个 16 位十六进制值转换为 Unicode 字符(ICU 中的UChar)。我不清楚的是如何将多个代码(2+ 十六进制字符串)转换为 3 位 Unicode 字符。比如我如何表示...

U+1F6A3 U+200D U+2642 U+FE0F ????‍♂️

作为单个 32 位 Unicode 字符。当输入是字符串 "U+1F6A3" "U+200D" "U+2642" "U+FE0F" 时(不是 16 位值,这些是文字字符串)。

【问题讨论】:

  • 注意:Unicode 很复杂,Unicode 不仅仅是字符。你认为它是单个字符的许多事情可以采取许多coldepoints。 Unicode 没有设置限制(我认为有一个建议,大约 15 或 31 个将主要字符组合在一起)。然后你可以将许多“这样的东西”组合成一个字素(或字素簇)。您无法使用固定数量的字节。 [幸运的是字体和整形引擎应该可以解决这个问题]。

标签: c++ unicode icu


【解决方案1】:

没有“32 位 Unicode 字符”这样的东西

Unicode 是 21 位字符集,而 UTF-32 只是一种编码,其中每个代码点都由单个代码单元编码。但是 UTF-32 不是一种固定长度的编码。许多字符不能像您上面发布的那样由单个 UTF-32 代码单元编码。 U+1F6A3 U+200D U+2642 U+FE0F 被简单地编码为 16 个字节的 0x1F6A3 0x200D 0x2642 0xFE0F,句点。你不能让它成为 32 位的。另请注意,U+1F6A3 不是 16 位的,因为 Unicode 是 21 位的,如前所述,必须由 UTF-16 中的 2 个代码单元编码

更多信息请阅读Isn't a 2-byte char datatype insufficient to deal with the concept of "characters" in a Unicode string?

【讨论】:

  • 所以所有的 64 位都只是内联在这样的文本中?
  • @user14998757 在 UTF-32 中是一系列 128 位,而不是 64 位。在 UTF-16 中是 D83D DEA3 200D 2642 FE0F,即 10 字节 = 80 位。许多其他字符可以由更多字节组合而成。它只是一个线性字节流,只需在任何十六进制编辑器中打开文件,或者十六进制转储字符串并查看。请阅读上面的链接
  • 知道了!谢谢!
猜你喜欢
  • 2013-05-07
  • 2015-09-30
  • 2017-03-11
  • 2020-09-12
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多