我尝试使用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中的字符串看起来并不容易。非常感谢,谢谢! :)
答案 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。