Python,去除UTF8无法处理的字符,例如emoji MySQL DB

Python, Remove characters, such as emoji, that cannot be handled by UTF8 MySQL DB

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

关键是只删除那些无法处理的字符。我从这个答案 中得到了这段代码,但它删除了太多内容。 (编辑:这是我从 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)

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

>>> u"abcd ♥ \ud83c".encode("utf-8", errors="replace").decode("utf-8")
'abcd ♥ ?'

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

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

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

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