【问题标题】:Python, Remove characters, such as emoji, that cannot be handled by UTF8 MySQL DBPython,删除 UTF8 MySQL DB 无法处理的字符,例如表情符号
【发布时间】:2016-10-06 17:21:22
【问题描述】:

如何替换 UTF8 MySQL DB 无法处理的字符,例如表情符号?????

关键是只删除那些无法处理的字符。我从这个答案removing emojis from a string in Python 中得到了这段代码,但它删除的太多了。 (编辑:这是我从remove unicode emoji using re in python 获得以下代码的页面)

myre = re.compile(u'('
    u'\ud83c[\udf00-\udfff]|'
    u'\ud83d[\udc00-\ude4f\ude80-\udeff]|'
    u'[\u2600-\u26FF\u2700-\u27BF])+', 
    re.UNICODE)

 my_text= myre.sub(r'EMOJI', my_text)

例如,这个心形符号♥可以保存到数据库中,但被上面的正则表达式捕获。

【问题讨论】:

  • 如果您不知道,mysql 可以使用 utf8mb4 处理表情符号。
  • 好的,谢谢!我肯定想在某个时候更改它,但现在不能在重新启动 MySQL 数据库所需的几个小时内关闭该站点。
  • 该代码不在您链接到的页面上:是您将其转换为匹配 16 位而不是 32 位宽字符吗?
  • 啊!进行了编辑。它在另一页上stackoverflow.com/questions/26568722/…

标签: python mysql regex utf-8 emoji


【解决方案1】:

MySQL 的utf8 精确地编码了基本的多语言平面(BMP)。您需要从补充平面中排除所有代码点,而不是专门的表情符号,因为在 MySQL 中这些代码点需要 utf8mb4

由于您似乎在匹配 16 位而不是 32 位宽的字符串,因此 BMP 之外的代码点被编码为0xD800..0xDBFF 范围内的所谓“高代理”,然后是“低代理”在0xDC00..0xDFFF 范围内。因此相应的正则表达式是:

u'[\ud800-\udbff][\udc00-\udfff]'.

♥ 不会匹配这个,因为它是u'\u2665'。我认为严格来说,如果后面跟着变体选择器U+FE0F,它只是一个表情符号,但无论哪种方式,它都安全地存在于 BMP 中。

【讨论】:

  • 这似乎可行,谢谢!留下了我尝试过的心和一些汉字。正则表达式将其转换为 EMOJIEMOJIEMOJI。会一直是 3 次吗?
  • @user984003:我无法重现你的结果,我得到了re.sub(u'[\ud800-\udbff][\udc00-\udfff]', 'EMOJI', u'\ud83d\ude00') == 'EMOJI',只有一次。我使用 u'\ud83d\ude00' 作为输入字符串,因为 D83D DE00 是 U+01F600 的代理对。
  • 你是对的!我不知道额外的从哪里来!你的回答效果很好。谢谢!
  • 使用 UCS-4 编译 Python 时,此答案不起作用。使用这个答案stackoverflow.com/a/13752628/984003
【解决方案2】:
>>> u"abcd ♥ \ud83c".encode("utf-8", errors="replace").decode("utf-8")
'abcd ♥ ?'

【讨论】:

  • 这给出了一个错误“UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 0: ordinal not in range(128)”
  • 因为@Quinchilion 使用的是 Python3。在 Python2 中是 u"abcd ♥ \ud83c".encode("utf-8", errors="replace").decode('utf8')
  • @SteveJessop 你说得对,谢谢。为兼容性而编辑。
  • 感谢您抽出宝贵时间!这次没有错误,但表情符号没有被替换。我继续将另一个答案设置为正确。
猜你喜欢
  • 1970-01-01
  • 2013-09-14
  • 2014-06-02
  • 2020-03-28
  • 2015-03-17
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
  • 2013-12-11
相关资源
最近更新 更多