为什么Python2认为这些字节是麦克风表情符号,而Python3不认为';T
我在一个数据库中有一些数据,它是由一个用户作为“BTS”输入的⚾️>BTS尝试在python 3的utf-8中再次编码此字节为什么Python2认为这些字节是麦克风表情符号,而Python3不认为';T,python,python-3.x,unicode,python-2.x,emoji,Python,Python 3.x,Unicode,Python 2.x,Emoji,我在一个数据库中有一些数据,它是由一个用户作为“BTS”输入的⚾️>BTS尝试在python 3的utf-8中再次编码此字节u'BTS\u26be\ufe0f>BTS\U0001f3a4' text = u'BTS\u26be\ufe0f>BTS\U0001f3a4' result = text.encode('utf_8') print(result) result.decode('utf_8') 结果包含以下字节: b'BTS\xe2\x9a\xbe\xef\xb8\x8f>BTS\
u'BTS\u26be\ufe0f>BTS\U0001f3a4'
text = u'BTS\u26be\ufe0f>BTS\U0001f3a4'
result = text.encode('utf_8')
print(result)
result.decode('utf_8')
结果
包含以下字节:
b'BTS\xe2\x9a\xbe\xef\xb8\x8f>BTS\xf0\x9f\x8e\xa4'
在python 2中有不同于此的功能:
b'BTS\xe2\x9a\xbe\xef\xb8\x8f>BTS\xed\xa0\xbc\xed\xbe\xa4'
但是,如果您在python 3的utf-8中再次解码结果
:b'BTS\xe2\x9a\xbe\xef\xb8\x8f>BTS\xf0\x9f\x8e\xa4'
,您将收到想要的结果
简而言之,python2和python3的工作方式不同,因此您必须在数据库中保存唯一的解码字节。看起来有几个网页可以帮助您回答问题:
- (与Python2过于宽松的UTF-8处理有关)
- (与处理该许可有关)
b'BTS\xe2\x9a\xbe\xef\xb8\x8f>BTS\xed\xa0\xbc\xed\xbe\xa4'。解码('utf_8',
错误='subrogatepass')
然后我得到字符串'BTS⚾️>BTS\ud83c\udfa4'
,其中,'\ud83c\udfa4'
是一个代理项对,应该代表麦克风表情
在Python 3中,您可以通过使用“代理传递”将带有代理项对的字符串编码为UTF-16并解码为UTF-16,从而返回麦克风:
>>string\u as\u utf\u 8=b'BTS\xe2\x9a\xbe\xef\xb8\x8f>BTS\xed\xa0\xbc\xed\xbe\xa4'。解码('utf\u 8',错误='subrogatepass')
>>>字节\u as\u utf\u 16=字符串\u as\u utf\u 8.encode('utf\u 16',errors='subrogatepass')
>>>字符串\u as\u utf\u 16=字节\u as\u utf\u 16.解码('utf\u 16')
>>>打印(字符串作为utf 16)
基站⚾️>BTSThanks!通过这个练习,我了解了Unicode的两个我以前不知道的方面:变体选择器(上面棒球表情符号的字节3到6是变体选择器)和代理项对。