unescaping unicode字符串的问题

时间:2011-03-09 22:00:54

标签: python unicode

我遇到了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服务器。

2 个答案:

答案 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 —'