Python 3 - 带有\ xHH十六进制值的字符串到Unicode

时间:2017-03-14 05:27:46

标签: python-3.x hex unicode-string unicode-escapes

我正在尝试使用需要多个十六进制值的字符转换字符串,如下所示:

'Mahou Shoujo Madoka\xe2\x98\x85Magica'

到它的unicode表示:

'Mahou Shoujo Madoka★Magica'

当我打印字符串时,它会尝试分别评估每个十六进制值,所以默认情况下我得到这个:

x = 'Mahou Shoujo Madoka\xe2\x98\x85Magica'
print(x)

Mahou Shoujo MadokaâMagica

所以我尝试了其他一些StackOverflow答案,例如Best way to convert string to bytes in Python 3?

x = 'Mahou Shoujo Madoka\xe2\x98\x85Magica'
z = x.encode('utf-8')
print('z:', z)
y = z.decode('utf-8')
print('y:', y)

z: b'Mahou Shoujo Madoka\xc3\xa2\xc2\x98\xc2\x85Magica'
y: Mahou Shoujo MadokaâMagica

Python: Convert Unicode-Hex-String to Unicode

z = 'Mahou Shoujo Madoka\xe2\x98\x85Magica'
x = binascii.unhexlify(binascii.hexlify(z.encode('utf-8'))).decode('utf-8')
print('x:', x)

x: Mahou Shoujo MadokaâMagica

还有其他人,但没有一个有效。我发现的大多数结果都是double backslash problem的人,但他们都没有我的确切问题。

我注意到当我执行str.encode时,它似乎在二进制中添加了一些额外的值(例如第一次尝试中z和x之间的差异),我不太清楚为什么。< / p>

所以我尝试在二进制文件中手动输入字符串的字符:

x = b'Mahou Shoujo Madoka\xe2\x98\x85Magica'
x.decode('utf-8')

'Mahou Shoujo Madoka★Magica'

它有效。但是除了输入外,我找不到从字符串转换为字符串的方法。我哪里错了?

1 个答案:

答案 0 :(得分:7)

在Python 3中,您的原始字符串是Unicode字符串,但包含看起来像UTF-8但未正确解码的Unicode代码点。解决它:

>>> s = 'Mahou Shoujo Madoka\xe2\x98\x85Magica'
>>> type(s)
<class 'str'>
>>> s.encode('latin1')
b'Mahou Shoujo Madoka\xe2\x98\x85Magica'
>>> s.encode('latin1').decode('utf8')
'Mahou Shoujo Madoka★Magica'

latin1编码恰好将1:1映射到Unicode中的前256个代码点,因此.encode('latin1')将代码点直接转换回字节。然后你可以正确地.decode('utf8')字节。