Python 将 ASCII 字符串转换为 UTF-8 字符串
我有一个字符串:
emission = "/home/guillaume/Vid\xc3\xa9os/pluzz/info_midi_102115995.mkv\n"
我想把它转换成:
emission = "/home/guillaume/Vidéos/pluzz/info_midi_102115995.mkv"
这是我的代码:(这些文本来自我在gtk窗口中的伪终端,使用的是python-vte)
text = repr(self.v.get_text(lambda *a: True).rstrip())
if "Output #0" in text:
line = text.split("matroska,",1)[1]
splitted = line.split() # to split the line
emission = splitted[1] # to get the str
emission = emission.replace("'", "")
emission = emission.replace(":", "")
print "1", emission
print type(emission)
emission = emission.decode("utf-8")
print "2", emission
结果:
1 /home/guillaume/Vid\xc3\xa9os/pluzz/info_midi_102115995.mkv\n
<type 'str'>
2 /home/guillaume/Vid\xc3\xa9os/pluzz/info_midi_102115995.mkv\n
谢谢
解决方案:我需要把
text = repr(self.v.get_text(lambda *a: True).rstrip())
改成:
text = str(self.v.get_text(lambda *a: True).rstrip())
感谢用户2357112!
1 个回答
2
>>> encoded = "/home/guillaume/Vid\xc3\xa9os/pluzz/info_midi_102115995.mkv\n"
>>> decoded = encoded.decode('utf-8')
>>> decoded
u'/home/guillaume/Vid\xe9os/pluzz/info_midi_102115995.mkv\n'
>>> print decoded
/home/guillaume/Vidéos/pluzz/info_midi_102115995.mkv
假设 file
确实是一个字节串,看起来和你展示的一样,那么 file.decode("utf-8")
应该是可以正常工作的(除了最后的换行符,你需要单独用 strip
去掉)。在 repr
输出中出现的 \xe9
是因为打印转义字符比打印一些奇怪的 Unicode 字符(比如零宽空格或让文本反向显示的字符)要清晰得多;解码后的字符串里包含了你想要的字符。
更新: 根据发布的代码和输出,我们可以看到 repr
调用把输入从编码的 Unicode 转换成了文本的 UTF-8 转义序列,使用了实际的反斜杠和十六进制,而不是 UTF-8 字节。把 repr
改成 str
解决了这个问题。完全去掉 repr
也可能会有同样的效果。