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

use*_*939 7 hex unicode-string unicode-escapes python-3.x

我试图转换一个字符串,其中包含需要多个十六进制值的字符,如下所示:

'Mahou Shoujo Madoka\xe2\x98\x85Magica'
Run Code Online (Sandbox Code Playgroud)

到它的unicode表示:

'Mahou Shoujo Madoka?Magica'
Run Code Online (Sandbox Code Playgroud)

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

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

Mahou Shoujo MadokaâMagica
Run Code Online (Sandbox Code Playgroud)

所以我尝试了其他一些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
Run Code Online (Sandbox Code Playgroud)

Python:将Unicode-Hex-String转换为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
Run Code Online (Sandbox Code Playgroud)

还有一些,但没有一个有效.我发现的大部分结果都是有双反斜杠问题的人,但没有一个人有我的确切问题.

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

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

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

'Mahou Shoujo Madoka?Magica'
Run Code Online (Sandbox Code Playgroud)

它起作用了.但是除了输入外,我找不到从字符串转换为字符串的方法.我哪里错了?

Mar*_*nen 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'
Run Code Online (Sandbox Code Playgroud)

latin1编码恰好1映射:1至以Unicode前256个码点,所以.encode('latin1')平移码点直接回字节.然后你可以.decode('utf8')正确的字节.

  • @Jens 您可以将其缩短为 `s='★'`,但这不是问题的重点。 (2认同)