无法解析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服务器。

+0

不的xmlrpclib同时处理逃逸,单独进行反向转义?而不是使用XML转义? – 2011-03-09 22:17:51

+0

我只是看到转义可能来自xmlrpc服务器,因为它在xml响应中发送了一个xml字符串。 – svenwltr 2011-03-09 22:29:30

首先,有"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对象。你应该给出一个你得到的字符串的例子,以及你从哪里得到它以及如何得到它。

+0

我已经添加了一个例子。 – 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 —'