无法解析unicode字符串的问题
我遇到了无法解析unicode字符串的问题。我尝试了以下,但它不适用于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)
有没有更好的方法去除反斜杠?
顺便说一句:我需要这个,因为xmlrpclib.ServerProxy转义的答复。
编辑:下面是我的XML-RPC请求的示例:
>>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服务器。
首先,有"string_escape"
和"unicode_escape"
,要么不能解码你给出的字符串。第一个读取作为字节串转义的字节串,并将其解码为字节串。第二个读取一个Unicode字符串转义并保存在一个字节字符串中,所以它不能读取输入的unicode对象,至少不是那些具有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对象。你应该给出一个你得到的字符串的例子,以及你从哪里得到它以及如何得到它。
我已经添加了一个例子。 – svenwltr 2011-03-09 22:59:47
有趣的是,您发布的错误似乎不使用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 —'
不的xmlrpclib同时处理逃逸,单独进行反向转义?而不是使用XML转义? – 2011-03-09 22:17:51
我只是看到转义可能来自xmlrpc服务器,因为它在xml响应中发送了一个xml字符串。 – svenwltr 2011-03-09 22:29:30