【问题标题】:How can I convert a 4-byte string into an unicode emoji?如何将 4 字节字符串转换为 unicode 表情符号?
【发布时间】:2021-11-10 15:35:19
【问题描述】:

我在 Delphi 10.3 中使用的 Web 服务返回一个由这四个字节组成的字符串: F0 9F 99 82 。我期待一个略带微笑的表情符号。 This 站点将此字节序列显示为该表情符号的 UTF-8 表示。所以我想我的字符串中有一个 UTF-8 表示,但它是一个实际的 unicode 字符串?如何将我的字符串转换为实际的 unicode 表示形式,例如在 TMemo 中显示它?

【问题讨论】:

  • 这不是一个“4 字节字符串” - 它是 一个 字符,以 UTF-8 的 4 个字节表示。然后使用TEncoding.UTF8.GetString( my_bytes )
  • 谢谢,确实有效。您应该将此作为可能的解决方案重新发布,以便我接受。
  • 首先如何获取字节数组?我猜是 TEncoding.XXX.GetBytes(InputString),但我不知道为 XXX 插入什么。我只有可用的网络服务填充的字符串变量,而不是实际的字节数组。
  • 所以右侧的相关问题如How to convert strings to array of byte and back 不为您回答?您的 Q 是否应该包含实际代码,以便我们首先看到所有内容?您确定不想创建新的单独 Q 吗?
  • 确实如此。我没注意到。

标签: delphi encoding


【解决方案1】:

字符?具有Unicode code point U+1F642。显示文本是通过编码定义的:必须如何解释一组字节:

  • UTF-8中,一个字符可以由8、16、24或32位(1到4个Bytes)组成;这个是$F0 $9F $99 $82
  • UTF-16中,一个字符可以包含16或32位(2或4字节=1或2Words);这个是$D83D $DE42(使用surrogates)。
  • UTF-32 中,一个字符始终由32 位(4 个字节= 1 CardinalDWord)组成,并且始终等于代码点,即是$1F642

在 Delphi 中,您可以使用:

  • TEncoding.UTF8.GetString() 代表 UTF-8
  • (或TEncoding.Unicode.GetString(),如果你有UTF-16LE
  • TEncoding.BigEndianUnicode.GetString(),如果你有UTF-16BE)。

请记住,? 只是一个字符,就像此文本的每个字母、符号和空格一样:它可以通过选择进行标记(即 Ctrl+A)和复制到剪贴板(即 Ctrl+C)。不需要特别照顾。

【讨论】:

  • 如果您知道接收到的文本是 UTF-8 编码的,另一种选择是将原始字节放入 UTF8String,然后将其分配给普通的 String。 RTL 将为您处理从 UTF-8 到 UTF-16(Delphi 的原生字符串编码)的转换。
猜你喜欢
  • 2019-05-20
  • 2015-04-02
  • 2017-04-16
  • 2012-01-27
  • 2016-02-21
  • 1970-01-01
  • 2020-08-20
  • 2018-08-28
  • 2014-06-29
相关资源
最近更新 更多