Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,删除UTF8 MySQL数据库无法处理的字符,如表情符号_Python_Mysql_Regex_Utf 8_Emoji - Fatal编程技术网

Python,删除UTF8 MySQL数据库无法处理的字符,如表情符号

Python,删除UTF8 MySQL数据库无法处理的字符,如表情符号,python,mysql,regex,utf-8,emoji,Python,Mysql,Regex,Utf 8,Emoji,如何替换字符,例如emojisMySQL的utf8精确编码基本多语言平面(BMP)。您需要从补充平面中排除所有代码点,而不是专门的表情符号,因为在MySQL中,这些代码点需要utf8mb4 >>> u"abcd ♥ \ud83c".encode("utf-8", errors="replace").decode("utf-8") 'abcd ♥ ?' 由于您似乎是针对16位而不是32位宽的字符串进行匹配,BMP之外的代码点在0xD800..0xDBFF范围内被编码为所谓的“高

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

>>> u"abcd ♥ \ud83c".encode("utf-8", errors="replace").decode("utf-8")
'abcd ♥ ?'
由于您似乎是针对16位而不是32位宽的字符串进行匹配,BMP之外的代码点在
0xD800..0xDBFF
范围内被编码为所谓的“高代理”,然后在
0xDC00..0xDFFF
范围内被编码为“低代理”。因此,相应的正则表达式为:

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


♥ 将不匹配,因为它是
u'\u2665'
。我认为严格地说,如果后面跟有变体选择器
U+FE0F
,它只是一个表情符号,但无论如何它都安全地放在BMP中。

如果你不知道,mysql可以用utf8mb4处理表情符号。是的,谢谢!我肯定想在某个时候更改它,但是现在不能让站点关闭几个小时来重新启动MySQL数据库。你链接到的页面上没有这些代码:是你将其转换为与16位而不是32位宽的字符相匹配吗?啊!进行了编辑。这是在另一个页面上给出的错误“UnicodeDecodeError:'ascii'编解码器无法解码位置0:ordinal不在范围(128)中的字节0xe2”,因为@Quinchilion正在使用Python3。在Python2中,这应该是
u“abcd♥ \ud83c“.encode(“utf-8”,errors=“replace”).decode(“utf8”)
@SteveJessop你说得对,谢谢。为兼容性而编辑。感谢您抽出时间!这次没有错误,但是表情符号没有被替换。我继续,并将另一个答案设置为正确。这似乎有效,谢谢!这留下了我的心和一些汉字。regexp将其转换为emojiemoji。总是3次吗?@user984003:我无法重现你的结果,我得到
re.sub(u'[\ud800-\udbff][\udc00-\udfff],'EMOJI',u'\ud83d\ude00')=='EMOJI'
,就一次。我使用
u'\ud83d\ude00'
作为输入字符串,因为D83D DE00是
u+01F600
的代理项对。你说得对!我不知道临时演员是从哪里来的!你的回答很有效。非常感谢。当使用UCS-4编译Python时,这个答案不起作用。用这个答案。