2008-11-18 35 views

Trả lời

63

% uXXXX là một non-standard encoding scheme rằng đã bị từ chối bởi các w3c, mặc dù thực tế rằng một thực hiện tiếp tục sống mãi trong đất JavaScript.

Kỹ thuật phổ biến hơn dường như là UTF-8 mã hóa chuỗi và sau đó% thoát các byte kết quả bằng% XX. Đề án này được hỗ trợ bởi urllib.unquote:

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

Thật không may, nếu bạn thực sự cần để hỗ trợ% uXXXX, bạn có thể sẽ phải cuộn giải mã của riêng bạn. Nếu không, nó có khả năng được nhiều hơn nữa thích hợp hơn để chỉ đơn giản là UTF-8 mã hóa unicode của bạn và sau đó% thoát khỏi các byte kết quả.

Một ví dụ hoàn chỉnh hơn:

>>> 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' nên 'urllib.unquote' – jamtoday

+0

Thú vị rằng một URI là một byte- trăm mã hóa chuỗi, thay vì chuỗi ký tự. – wberry

+0

@jamtoday không cần thiết, trong Python 2.7.5+ bạn có thể sử dụng 'urllib2.unquote' chỉ cần thử' print (dir (urllib2)) ' –

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

này sẽ làm điều đó nếu bạn hoàn toàn phải có điều này (tôi thực sự đồng ý với tiếng kêu của "phi tiêu chuẩn"):

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 
+1

Một trường hợp bệnh lý nhẹ, nhưng: unquote_u ('Tan% 25u0131m') -> u'Tan \ u0131m 'thay vì' Tan% u0131 'như mong muốn. Chỉ cần một lời nhắc nhở về lý do tại sao bạn có thể không muốn viết một bộ giải mã trừ khi bạn thực sự cần nó. –

+0

Tôi hoàn toàn đồng ý. Đó là lý do tại sao tôi thực sự không muốn cung cấp một giải pháp thực tế. Những điều này không bao giờ đơn giản như vậy. O.P. có thể đã tuyệt vọng mặc dù, và tôi nghĩ rằng điều này bổ sung cho câu trả lời tuyệt vời của bạn. –

4

có một lỗi trong phiên bản ở trên, nơi nó freaks ra đôi khi có cả ascii mã hóa và unicode mã hóa ký tự trong chuỗi. Tôi nghĩ rằng nó đặc biệt khi có các ký tự từ phạm vi 128 trên như '\ xab' ngoài unicode.

ví dụ: "% 5B% AB% u03E1% BB% 5D" gây ra lỗi này.

tôi thấy nếu bạn chỉ làm những cái unicode đầu tiên, vấn đề ra đi:

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

\ xab không phải là ký tự mà là một byte. Trong thực tế ví dụ của bạn "chuỗi" chứa cả byte và ký tự, mà không hợp lệ như một chuỗi duy nhất trong bất kỳ ngôn ngữ tôi biết. – wberry

Các vấn đề liên quan