2011-03-09 95 views
0

我遇到了無法解析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

回答

2

首先,有"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

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