为什么Python2认为这些字节是麦克风表情符号,而Python3不认为';T

为什么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\

我在一个数据库中有一些数据,它是由一个用户作为“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\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处理有关)
  • (与处理该许可有关)
如果我使用Python 3的“代理进程”错误处理程序解码从Python 2获得的字节,即:

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是变体选择器)和代理项对。