我遇到了unescapting unicode字符串的问题。我尝试了以下方法,但它不适用于unicode字符。
>>> s = ur"\'test\'"
>>> s.decode("string_escape")
"'test'"
>>> s = ur"\'test \u2014\'"
>>> s.decode("string_escape")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2014' in position 7:
ordinal not in range(128)
有没有更好的方法来删除反斜杠?
Btw:我需要这个,因为xmlrpclib.ServerProxy会逃避回复。
编辑:以下是我的xmlrpc请求的示例:
>>import xmlrpclib
>>server = xmlrpclib.ServerProxy("http://ws.audioscrobbler.com/2.0/")
>>xml_data = server.tag.search({'api_key':'...','tag':'80s'})
>>print xml_data
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<lfm status=\"ok\">
<results for=\"80s\" xmlns:opensearch=\"http://a9.com/-/spec/opensearch/1.1/\">
<opensearch:Query role=\"request\" searchTerms=\"80s\" startPage=\"1\" />
...
我认为转义来自xmlrpc服务器。
答案 0 :(得分:2)
首先,有"string_escape"
和"unicode_escape"
,要么无法解码您提供的字符串。第一个读取作为字节串转义的字节串,并将其解码为字节串。第二个读取转义的unicode字符串并保存在bytestring中,因此它无法读取输入的unicode对象,至少不会读取其中包含unicode字符的对象。
我相信你在这里给出的原始字符串是错误的,而你实际上想要s.decode('unicode_escape')
来源于来自你的真实字符串。
如果我不正确,您可以做的最好的事情是手动转义任何未转义的单引号re
,在其周围添加额外的单引号并使用ast.literal_eval
。
def substitute(match):
if len(match.group(1)) % 2 == 1:
return match.group()
else:
return ur"%s\%s" % (match.group(1), match.group(2))
ast.literal_eval("'%s'" % re.sub(ur"(\\+)(')", substitute, s))
第三个选项是需要将字符串传递给ast.literal_eval
,而无需您做任何额外的工作。三者中的哪一个取决于你作为一个字符串的确切含义。
我的另一个怀疑是它可能是一个JSON对象。你应该给出一个你正在获得的字符串的例子,你从哪里得到它以及如何得到它。
答案 1 :(得分:0)
有趣的是,使用Python 2.6.4似乎不会发生您发布的错误:
In [110]: s = ur"\'test\'"
In [111]: s.decode("string_escape")
Out[111]: "'test'"
In [112]: s = ur"\'test \u2014\'"
In [113]: s.decode("string_escape")
Out[113]: "'test \xe2\x80\x94'"
In [114]: print(s.decode("string_escape"))
'test —'