Python3 - 将带有\xHH十六进制值的字符串转换为Unicode

9
我正在尝试转换一个包含多个十六进制值的字符的字符串,例如:
'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答案,比如在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: 将Unicode十六进制字符串转换为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

还有其他一些方法,但都没有起作用。我找到的大多数结果是人们遇到了双反斜杠问题,但没有一个人遇到了我的确切问题。

我注意到当我使用str.encode时,它似乎会在二进制中添加一些额外的值(例如第一次尝试中z和x之间的差异),我不太确定为什么。

所以我尝试手动将字符串的字符输入二进制:

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

'Mahou Shoujo Madoka★Magica'

它可以工作。但我找不到直接将字符串转换为二进制的方法,除了手动输入外。我错在哪里?

1个回答

9
在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 MadokaMagica'

latin1 编码恰好一一映射到 Unicode 中的前 256 个代码点,因此 .encode('latin1') 可以将代码点直接转换为字节。然后您可以适当地使用 .decode('utf8') 对这些字节进行解码。


1
要将字符串赋值给变量,您也可以简化上述代码为s = b"\xe2\x98\x85".decode("utf8") - Jens
2
@Jens,你可以把它缩短为s='★',但这不是问题的重点。 - Mark Tolonen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接