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 中都是安全的。
如何替换 UTF8 MySQL 数据库无法处理的字符,例如表情符号?
关键是只删除那些无法处理的字符。我从这个答案
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 中都是安全的。