2008-11-18 9 views
40

मेरे पास एक यूनिकोड स्ट्रिंग है जैसे "तनिम" जिसे किसी भी तरह "टैन% u0131m" के रूप में एन्कोड किया गया है। मैं इस एन्कोडेड स्ट्रिंग को वापस मूल यूनिकोड में कैसे परिवर्तित कर सकता हूं। स्पष्ट रूप से urllib.unquote यूनिकोड का समर्थन नहीं करता है।पायथन में urlencoded यूनिकोड स्ट्रिंग को कैसे निकालें?

उत्तर

63

% uXXXX तथ्य एक कार्यान्वयन जावास्क्रिप्ट देश में रहने के लिए जारी है कि बावजूद, एक non-standard encoding scheme कि W3C द्वारा अस्वीकार कर दिया गया है।

अधिक सामान्य तकनीक यूटीएफ -8 स्ट्रिंग को एन्कोड करने लगती है और फिर% XX का उपयोग करके परिणामस्वरूप बाइट से बचती है। यह योजना urllib.unquote द्वारा समर्थित है:

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

दुर्भाग्यवश, अगर आप वास्तव में जरूरत% uXXXX समर्थन करने के लिए, तो आप शायद अपने स्वयं के डिकोडर रोल करना होगा। अन्यथा, यह आपके यूनिकोड को केवल यूटीएफ -8 एन्कोड करने के लिए कहीं अधिक बेहतर होने की संभावना है और फिर परिणामी बाइट से बचें।

एक और पूरी उदाहरण:

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

+0

दिलचस्प है कि एक यूआरआइ एक प्रतिशत-एन्कोड byte- है होना चाहिए एक चरित्र-स्ट्रिंग के बजाय स्ट्रिंग। – wberry

+0

@jamtoday जरूरी नहीं है, पायथन 2.7.5+ में आप 'urllib2.unquote' का उपयोग कर सकते हैं' प्रिंट (डीआईआर (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

अगर आप पूरी तरह से इस राशि के लिए है (मैं वास्तव में "गैर मानक" रोता से सहमत हैं) यह यह करना होगा:

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

थोड़ा पैथोलॉजिकल केस, लेकिन: unquote_u ('टैन% 25u0131m') -> 'टैन% u0131' की बजाय 'u'Tan \ u0131m' जैसा होना चाहिए। सिर्फ एक अनुस्मारक कि आप शायद एक डिकोडर क्यों नहीं लिखना चाहते हैं जब तक कि आपको वास्तव में इसकी आवश्यकता न हो। –

+0

मैं पूरी तरह से सहमत हूं। यही कारण है कि मैं वास्तव में एक वास्तविक समाधान की पेशकश करने के लिए उत्सुक नहीं था। ये चीजें इतनी सरल नहीं होती हैं। हालांकि ओपी शायद बेताब हो सकता है, और मुझे लगता है कि यह आपके उत्कृष्ट उत्तर को पूरा करता है। –

4

उपर्युक्त संस्करण में एक बग है जहां यह कभी-कभी बाहर निकलता है जब स्ट्रिंग में एसिसी एन्कोडेड और यूनिकोड एन्कोडेड वर्ण दोनों होते हैं। मुझे लगता है कि यह विशेष रूप से जब यूनिकोड के अलावा ऊपरी 128 रेंज जैसे '\ xab' के वर्ण होते हैं।

उदाहरण के लिए। "% 5 बी% एबी% u03E1% बीबी% 5 डी" इस त्रुटि का कारण बनता है।

मैंने पाया अगर आप सिर्फ यूनिकोड लोगों पहले किया था, समस्या दूर चला गया:

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 एक चरित्र नहीं है लेकिन बाइट है। असल में आपके उदाहरण "स्ट्रिंग" में बाइट्स और वर्ण दोनों शामिल हैं, जो कि मुझे पता है कि किसी भी भाषा में एक स्ट्रिंग के रूप में मान्य नहीं है। – wberry

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^