修复由(某些)转义反斜杠打破的unicode字符串

时间:2018-05-06 13:44:31

标签: python string unicode

我在看这个问题:python3 replacing double backslash with single backslash [duplicate]

并筛选对类似问题的回答:Python Replace \ with \ Why can't Python's raw string literals end with a single backslash?How do I unescape a unicode escaped string in python?

当我意识到没有一个答案可以真正解决这个问题。 假设我有一个破解的unicode字符串,它包含两个转义的反斜杠和转义字符:

my_str = '\\xa5\\xc0\\xe6aK\xf9\\x80\\xb1\\xc8*\x01\x12$\\xfbp\x1e(4\\xd6{;Z'

当我打印它时,一些角色评估:

print(my_str)
\xa5\xc0\xe6aKù\x80\xb1\xc8*☺↕$\xfbp▲(4\xd6{;Z

我可以像这样手动修复它:

my_str = repr(my_str)
my_str
"'\\\\xa5\\\\xc0\\\\xe6aKù\\\\x80\\\\xb1\\\\xc8*\\x01\\x12$\\\\xfbp\\x1e(4\\\\xd6{;Z'"
my_str = my_str.replace('\\\\','\\')
print(my_str)
'\xa5\xc0\xe6aKù\x80\xb1\xc8*\x01\x12$\xfbp\x1e(4\xd6{;Z'

但此时我必须手动将打印结果复制并粘贴到变量中以完成修复:

my_str = '\xa5\xc0\xe6aKù\x80\xb1\xc8*\x01\x12$\xfbp\x1e(4\xd6{;Z'
print(my_str)
¥ÀæaKù±È*☺↕$ûp▲(4Ö{;Z

如何在不复制和粘贴的情况下执行此操作?

2 个答案:

答案 0 :(得分:2)

剥离单引号,编码以获取字节,然后使用" unicode-escape"解码:

# original code
my_str = '\\xa5\\xc0\\xe6aK\xf9\\x80\\xb1\\xc8*\x01\x12$\\xfbp\x1e(4\\xd6{;Z'
my_str = repr(my_str)
my_str = my_str.replace('\\\\','\\')
print(my_str)
# encode/decode stuff
print(my_str.strip("'").encode().decode("unicode-escape"))

打印:

'\xa5\xc0\xe6aKù\x80\xb1\xc8*\x01\x12$\xfbp\x1e(4\xd6{;Z'
¥ÀæaKù±È*$ûp(4Ö{;Z

答案 1 :(得分:0)

我在接受答案的评论中提到ast.literal_eval。但我觉得我应该在这里包含一个代码片段:

Reverse repr function in Python

from ast import literal_eval

my_str = '\\xa5\\xc0\\xe6aK\xf9\\x80\\xb1\\xc8*\x01\x12$\\xfbp\x1e(4\\xd6{;Z'
my_str = repr(my_str)
my_str = my_str.replace('\\\\','\\')
print(literal_eval(my_str))

结果(Python 3):

¥ÀæaKù±È*☺↕$ûp▲(4Ö{;Z