我有这个str (来自一个我无法修复的文件):
In [131]: s
Out[131]: '\\xce\\xb8Oph'这与用utf8编码的字符串的repr非常接近:
In [132]: repr('θOph'.encode('utf8'))
Out[132]: "b'\\xce\\xb8Oph'"我需要原始的编码字符串。我可以用
In [133]: eval("b'{}'".format(s)).decode('utf8')
Out[133]: 'θOph'但我会..。悲伤的?如果没有更简单的选择去得到它。有更好的办法吗?
发布于 2016-07-15 17:05:58
您的解决方案是可以的,唯一的问题是,当使用任意输入时,eval是危险的。安全的替代方法是使用ast.literal_eval
>>> s = '\\xce\\xb8Oph'
>>> from ast import literal_eval
>>> literal_eval("b'{}'".format(s)).decode('utf8')
'\u03b8Oph'在eval中,您必须遵守:
>>> eval("b'{}'".format("1' and print('rm -rf /') or b'u r owned")).decode('utf8')
rm -rf /
'u r owned'由于ast.literal_eval与repr的文字截然相反,所以我想这就是您所要寻找的。
升华
如果您有一个带有转义unicode的文件,您可能希望使用unicode_escape编码打开它,就像Ginger++在回答中建议的那样。我将保留我的答案,因为问题是“如何将repr转换成编码的字符串”,而不是“如何用转义unicode解码文件”。
发布于 2016-07-15 17:30:38
只需使用unicode_escape编码打开文件,如下所示:
with open('name', encoding="unicode_escape") as f:
pass # your code here原来的答案:
>>> '\\xce\\xb8Oph'.encode('utf-8').decode('unicode_escape')
'θOph'如果您以二进制模式(而不是文本模式)读取文件,则可以将该编码删除到UTF-8:
>>> b'\\xce\\xb8Oph'.decode('unicode_escape')
'θOph'发布于 2016-07-14 23:11:42
不幸的是,这确实是个问题。在这里你会被轻柔地杀死。
我只能想到:
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"))也许还有别的办法来完成这件事,但现在我只有这些了。
https://stackoverflow.com/questions/38385089
复制相似问题