解码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会对响应进行转义。
编辑:这是我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服务器的。
2 个回答
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 —'
2
首先,有两个东西叫做 "string_escape"
和 "unicode_escape"
,它们都无法解码你给的字符串。第一个是把字节串当作字节串来读取和解码,而第二个是读取一个被转义的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对象。你应该给出你得到的字符串的例子,以及你是从哪里得到的和怎么得到的。