2008-11-18 37 views

回答

63

%uXXXX是已經拒絕了W3C一個non-standard encoding scheme,儘管實現繼續在JavaScript土地生活的事實。

更常見的技術似乎是UTF-8對字符串進行編碼,然後使用%XX轉義結果字節。該方案是由urllib.unquote支持:

>>> urllib2.unquote("%0a") 
'\n' 

不幸的是,如果你真的需要支持%uXXXX,你可能會推出自己的解碼器。否則,只需簡單地使用UTF-8編碼你的unicode,然後%轉義生成的字節就可能更好。

一個更完整的例子:

>>> u"Tanım" 
u'Tan\u0131m' 
>>> url = urllib.quote(u"Tanım".encode('utf8')) 
>>> urllib.unquote(url).decode('utf8') 
u'Tan\u0131m' 
+3

「urllib2.unquote」應該是「urllib.unquote」 – jamtoday 2009-09-07 00:30:47

+0

有趣的是一個URI是一個百分比編碼字節 - 字符串,而不是字符串。 – wberry 2011-09-20 18:13:48

+0

@jamtoday不必要的,在Python 2.7.5 +中,您可以使用`urllib2.unquote`只是嘗試`print(dir(urllib2))` – 2014-02-21 18:49:23

9
def unquote(text): 
    def unicode_unquoter(match): 
     return unichr(int(match.group(1),16)) 
    return re.sub(r'%u([0-9a-fA-F]{4})',unicode_unquoter,text) 
6

這將做到這一點,如果你絕對有這個(我實在是與「非標」的呼聲同意):

from urllib import unquote 

def unquote_u(source): 
    result = unquote(source) 
    if '%u' in result: 
     result = result.replace('%u','\\u').decode('unicode_escape') 
    return result 

print unquote_u('Tan%u0131m') 

> Tanım 
4

上述版本中存在一個錯誤,當字符串中同時存在ascii編碼字符和unicode編碼字符時,它有時會出錯。我認爲它特別是當除了Unicode之外還有來自128個範圍的字符,比如'\ xab'。

例如。 「%5B%AB%u03E1%BB%5D」導致此錯誤。

我發現,如果你只是做了統一的人首先,這個問題就走了:

def unquote_u(source): 
    result = source 
    if '%u' in result: 
    result = result.replace('%u','\\u').decode('unicode_escape') 
    result = unquote(result) 
    return result 
相關問題