首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将repr转换为编码字符串

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

Stack Overflow用户
提问于 2016-07-14 22:15:44
回答 4查看 1.8K关注 0票数 3

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

代码语言:javascript
复制
In [131]: s
Out[131]: '\\xce\\xb8Oph'

这与用utf8编码的字符串的repr非常接近:

代码语言:javascript
复制
In [132]: repr('θOph'.encode('utf8'))
Out[132]: "b'\\xce\\xb8Oph'"

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

代码语言:javascript
复制
In [133]: eval("b'{}'".format(s)).decode('utf8')
Out[133]: 'θOph'

但我会..。悲伤的?如果没有更简单的选择去得到它。有更好的办法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-07-15 17:05:58

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

代码语言:javascript
复制
>>> s = '\\xce\\xb8Oph'
>>> from ast import literal_eval
>>> literal_eval("b'{}'".format(s)).decode('utf8')
'\u03b8Oph'

在eval中,您必须遵守:

代码语言:javascript
复制
>>> eval("b'{}'".format("1' and print('rm -rf /') or b'u r owned")).decode('utf8')
rm -rf /
'u r owned'

由于ast.literal_evalrepr的文字截然相反,所以我想这就是您所要寻找的。

升华

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

票数 6
EN

Stack Overflow用户

发布于 2016-07-15 17:30:38

只需使用unicode_escape编码打开文件,如下所示:

代码语言:javascript
复制
with open('name', encoding="unicode_escape") as f:
    pass # your code here

原来的答案:

代码语言:javascript
复制
>>> '\\xce\\xb8Oph'.encode('utf-8').decode('unicode_escape')
'θOph'

如果您以二进制模式(而不是文本模式)读取文件,则可以将该编码删除到UTF-8:

代码语言:javascript
复制
>>> b'\\xce\\xb8Oph'.decode('unicode_escape')
'θOph'
票数 4
EN

Stack Overflow用户

发布于 2016-07-14 23:11:42

不幸的是,这确实是个问题。在这里你会被轻柔地杀死。

我只能想到:

代码语言:javascript
复制
s = '\\xce\\xb8Oph\\r\\nMore test\\t\\xc5\\xa1'
n = ""
x = 0
while x!=len(s):
    if s[x]=="\\":
        sx = s[x+1:x+4]
        marker = sx[0:1]
        if   marker=="x": n += chr(int(sx[1:], 16)); x += 4
        elif marker in ("'", '"', "\\", "n", "r", "v", "t", "0"):
            # Pull this dict out of a loop to speed things up
            n += {"'": "'", '"': '"', "\\": "\\", "n": "\n", "r": "\r", "t": "\t", "v": "\v", "0": "\0"}[marker]
            x += 2
        else: n += s[x]; x += 1
    else: n += s[x]; x += 1
print repr(n), repr(s)
print repr(n.decode("UTF-8"))

也许还有别的办法来完成这件事,但现在我只有这些了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38385089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档