解码编码 UTF-8 不会导致原始的 unicode
decode-encode UTF-8 doesn't lead to the original unicode
当我试图通过再次解码和编码来分离两个 Unicode 字符时,我在 return 中没有得到相同的 Unicode,但我得到了不同的 Unicode。
附件是我尝试这样做时的回复。
>>> s ='\xf0\x9f\x93\xb1\xf0\x9f\x9a\xac'
>>> u = s.decode("utf-8")
>>> u
u'\U0001f4f1\U0001f6ac'
>>> u[0].encode("utf-8")
'\xed\xa0\xbd'
>>> u[1].encode("utf-8")
'\xed\xb3\xb1'
>>> u[0]
u'\ud83d'
>>> u[1]
u'\udcf1'
您的 python 版本使用的是 UCS-2(每个字符 16 位),但这些特定的 unicode 字符需要 32 位,因此 u 的元素代表一个字符的 "half"。 u.encode('utf-8')
正常工作,因为它理解编码。
您的 utf-8 字符串对这两个字符进行编码:
U+1F4F1 MOBILE PHONE character
(📱)
U+1F6AC SMOKING SYMBOL character
(🚬)
(通过这个解码器:http://software.hixie.ch/utilities/cgi/unicode-decoder/utf8-decoder)
当我试图通过再次解码和编码来分离两个 Unicode 字符时,我在 return 中没有得到相同的 Unicode,但我得到了不同的 Unicode。
附件是我尝试这样做时的回复。
>>> s ='\xf0\x9f\x93\xb1\xf0\x9f\x9a\xac'
>>> u = s.decode("utf-8")
>>> u
u'\U0001f4f1\U0001f6ac'
>>> u[0].encode("utf-8")
'\xed\xa0\xbd'
>>> u[1].encode("utf-8")
'\xed\xb3\xb1'
>>> u[0]
u'\ud83d'
>>> u[1]
u'\udcf1'
您的 python 版本使用的是 UCS-2(每个字符 16 位),但这些特定的 unicode 字符需要 32 位,因此 u 的元素代表一个字符的 "half"。 u.encode('utf-8')
正常工作,因为它理解编码。
您的 utf-8 字符串对这两个字符进行编码:
U+1F4F1 MOBILE PHONE character
(📱)
U+1F6AC SMOKING SYMBOL character
(🚬)
(通过这个解码器:http://software.hixie.ch/utilities/cgi/unicode-decoder/utf8-decoder)