将八位字符串转换为Unicode字符串,Python 3

时间:2017-10-09 05:44:54

标签: string python-3.x unicode octal

我尝试使用Python 3将具有八进制转义Unicode的字符串转换回适当的Unicode字符串,如下所示:

"training\345\256\214\346\210\220\345\276\214.txt"是读入字符串。

"training完成後.txt"是字符串的实际代表,我试图获取。

然而,在浏览SO之后,似乎建议的解决方案是我在Python 3中找到的最多的地方:

decoded_string = bytes(myString, "utf-8").decode("unicode_escape")

不幸的是,当应用于我的示例时,这似乎会产生错误的Unicode字符串:

'trainingå®Â\x8cæÂ\x88Â\x90å¾Â\x8c.txt'

对于字节文字以及Python 2来说,这似乎很容易,但遗憾的是,Python 3中的字符串看起来并不容易。非常感谢,谢谢! :)

1 个答案:

答案 0 :(得分:1)

假设您的起始字符串是带有文字反斜杠的Unicode字符串,首先需要一个字节字符串来使用unicode-escape编解码器,但八进制转义符是UTF-8,因此您需要再次将其转换为一个字节字符串然后解码为UTF-8:

>>> s = r'training\345\256\214\346\210\220\345\276\214.txt'
>>> s
'training\\345\\256\\214\\346\\210\\220\\345\\276\\214.txt'
>>> s.encode('latin1')
b'training\\345\\256\\214\\346\\210\\220\\345\\276\\214.txt'
>>> s.encode('latin1').decode('unicode-escape')
'trainingå®\x8cæ\x88\x90å¾\x8c.txt'
>>> s.encode('latin1').decode('unicode-escape').encode('latin1')
b'training\xe5\xae\x8c\xe6\x88\x90\xe5\xbe\x8c.txt'
>>> s.encode('latin1').decode('unicode-escape').encode('latin1').decode('utf8')
'training完成後.txt'

请注意,latin1编解码器将Unicode代码点U + 0000直接转换为U + 00FF到字节00-FF。