如何将 repr 转换为编码字符串

mat*_*asg 3 python python-3.x

我有这个str(来自我无法修复的文件):

\n\n
In [131]: s\nOut[131]: \'\\\\xce\\\\xb8Oph\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

这接近于 utf8 编码的字符串的表示:

\n\n
In [132]: repr(\'\xce\xb8Oph\'.encode(\'utf8\'))\nOut[132]: "b\'\\\\xce\\\\xb8Oph\'"\n
Run Code Online (Sandbox Code Playgroud)\n\n

我需要原始编码字符串。我可以用

\n\n
In [133]: eval("b\'{}\'".format(s)).decode(\'utf8\')\nOut[133]: \'\xce\xb8Oph\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我会……悲伤?如果没有更简单的选择来获得它。有没有更好的办法?

\n

Pau*_*ine 7

您的解决方案没问题,唯一的问题是eval与任意输入一起使用时是危险的。安全的替代方法是使用ast.literal_eval

>>> s = '\\xce\\xb8Oph'
>>> from ast import literal_eval
>>> literal_eval("b'{}'".format(s)).decode('utf8')
'\u03b8Oph'
Run Code Online (Sandbox Code Playgroud)

通过评估,您将受到:

>>> eval("b'{}'".format("1' and print('rm -rf /') or b'u r owned")).decode('utf8')
rm -rf /
'u r owned'
Run Code Online (Sandbox Code Playgroud)

由于与文字ast.literal_eval相反repr,我想这就是您正在寻找的。

[更新]

unicode_escape如果您有一个带有转义 unicode 的文件,您可能需要使用 Ginger++ 答案中建议的编码打开它。我会保留我的答案,因为问题是“如何将 repr 转换为编码字符串”,而不是“如何使用转义的 unicode 解码文件”。

  • 为literal_eval() 喝彩:D 感谢您对 eval() 的支持,这是一个很好的方法。不过,不要忘记未转义的撇号和/或引号。 (3认同)