我有这个str(来自我无法修复的文件):
In [131]: s\nOut[131]: \'\\\\xce\\\\xb8Oph\'\nRun Code Online (Sandbox Code Playgroud)\n\n这接近于 utf8 编码的字符串的表示:
\n\nIn [132]: repr(\'\xce\xb8Oph\'.encode(\'utf8\'))\nOut[132]: "b\'\\\\xce\\\\xb8Oph\'"\nRun Code Online (Sandbox Code Playgroud)\n\n我需要原始编码字符串。我可以用
\n\nIn [133]: eval("b\'{}\'".format(s)).decode(\'utf8\')\nOut[133]: \'\xce\xb8Oph\'\nRun Code Online (Sandbox Code Playgroud)\n\n但我会……悲伤?如果没有更简单的选择来获得它。有没有更好的办法?
\n您的解决方案没问题,唯一的问题是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 解码文件”。
| 归档时间: |
|
| 查看次数: |
2255 次 |
| 最近记录: |