【问题标题】:How can I restore proper encoding of 4 byte emoji characters that have been stored in plain utf8 - like this: 😊?如何恢复以纯 utf8 格式存储的 4 字节表情符号字符的正确编码 - 像这样:ðŸ∼Š?
【发布时间】:2013-12-05 04:13:19
【问题描述】:

是否可以再次将 emoji 3 或 4 字节字符串重新编码为 emoji?

我继承了一个带有 utf8_unicode_ci 编码的 MySQL Innodb 表。这些 emoji 4 字节字符串无处不在。是否可以将它们翻译回表情符号?

第一步是将character set 修改为utf8mb4。这将所有像 ð��£ 这样的字符串更改为像这样的字符串:😊

但我真正想要的是将😊 翻译成 之类的东西。 (不知道😊是不是真的笑脸)

【问题讨论】:

  • 您在说什么“4 位字符”?将表情符号翻译成表情符号是什么意思?这看起来像是字符编码不匹配。显示一些实际数据(十六进制转储或其他提供真实数据的东西——“�”是表示字符级数据错误的替换字符,不告诉数据是什么)。
  • @JukkaK.Korpela: Emoji 在 BMP 之外,这意味着您需要 4 个字节(而不是位)才能将它们编码为 UTF-8。
  • 我将排序规则修改为 utf8mb4,现在替换字符看起来像 😊。但我仍然不确定如何看到实际的表情符号。
  • @Ignacio 一些(好吧,大多数)表情符号在 BMP 之外,但也有一些在里面。例如⛄。 ??????
  • @Ryan 事后将列从utf8 更改为utf8mb4 不一定有帮助。如果您尝试将 BMP 之外的字符存储在 utf8 列中,则数据已经无法修复。我们需要更多关于原始数据的细节来说明是否可以做任何事情。而“ðŸ∼Š”不是笑脸,“ðŸ∼Š”是“ðŸ∼Š”。如果正确处理了编码 ????会是????。

标签: php unicode encoding character-encoding emoji


【解决方案1】:

大多数表情符号需要 21 位,这是 Supplementary Multilingual Plane 的一部分。根据该页面上的图表,表情符号以1F 为前缀,范围从1F31F7。如果您的应用程序只是简单地剥离前 5 位以适应 16 位,那么您将得到 3xxx -> 7xxx。根据Basic Multilingual Plane 上的信息,这主要映射到亚洲表意文字。鉴于您显示的数据不是表意文字,您可能需要更深入地分析数据,以查看是否可以通过将这些位重新组合在一起并添加 1F 前缀来恢复。

【讨论】:

    【解决方案2】:

    灵感来自Ignacio Vazquez-Abrams' comment。接下来python代码sn-p显示原始过程EmojiMojibake,反之亦然(修复):

    print ( "\nEmoji to mojibake (origin):")
    for emojiChar in ['?','?','?','?']:
        print ( emojiChar, emojiChar.encode('utf8').decode('cp1252'))
    
    print ( "\nmojibake to Emoji (repair):")
    for mojibakeString in ['😊','😣','👽','😎','🙇']:
        print ( mojibakeString, mojibakeString.encode('cp1252').decode('utf8'))
    

    知道这个问题被标记为php而不是python;让我希望类似的 php 解决方案可以非常接近......

    输出

    ==> chcp 65001
    Active code page: 65001
    
    ==> D:\test\Python\20108312.py
    
    Emoji to mojibake (origin):
    ? 😊
    ? 😣
    ? 👽
    ? 😎
    
    mojibake to Emoji (repair):
    😊 ?
    😣 ?
    👽 ?
    😎 ?
    🙇 ?
    
    ==>
    

    Python 版本:

    Python 3.5.1 (v3.5.1:37a07cee5969, Dec  6 2015, 01:54:25) [MSC v.1900 64 bit (AMD64)] on win32
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-14
      • 2020-04-23
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      • 2016-08-09
      • 1970-01-01
      相关资源
      最近更新 更多