यूनिकोड वर्णों को एनकोड करने का उचित तरीका क्या है?


107

मुझे गैर-मानक% uxxxx योजना का पता है, लेकिन यह एक बुद्धिमान विकल्प नहीं लगता है क्योंकि इस योजना को W3C द्वारा अस्वीकार कर दिया गया है।

कुछ दिलचस्प उदाहरण:

दिल का चरित्र। यदि मैं इसे अपने ब्राउज़र में टाइप करता हूँ:

http://www.google.com/search?q=♥

फिर इसे कॉपी और पेस्ट करें, मुझे यह URL दिखाई दे रहा है

http://www.google.com/search?q=%E2%99%A5

जिससे यह प्रतीत होता है कि फ़ायरफ़ॉक्स (या सफारी) ऐसा कर रहा है।

urllib.quote_plus(x.encode("latin-1"))
'%E2%99%A5'

ट्रिपल डॉट कैरेक्टर की तरह लैटिन -1 में एनकोड की जा सकने वाली चीजों को छोड़कर, जो समझ में आता है।

अगर मैं URL टाइप करता हूँ

http://www.google.com/search?q=…

मेरे ब्राउज़र में फिर कॉपी और पेस्ट करें, मुझे मिलता है

http://www.google.com/search?q=%E2%80%A6

वापस। जो करने का परिणाम प्रतीत होता है

urllib.quote_plus(x.encode("utf-8"))

जो समझ में आता है ... लैटिन -1 के साथ एन्कोड नहीं किया जा सकता है।

लेकिन फिर यह मेरे लिए स्पष्ट नहीं है कि ब्राउज़र कैसे जानता है कि क्या यूटीएफ -8 या लैटिन -1 के साथ डिकोड करना है।

चूंकि यह अस्पष्ट प्रतीत होता है:

In [67]: u"…".encode('utf-8').decode('latin-1')
Out[67]: u'\xc3\xa2\xc2\x80\xc2\xa6'

काम करता है, इसलिए मुझे नहीं पता कि ब्राउज़र कैसे पता लगाता है कि उसे UTF-8 या लैटिन -1 के साथ डिकोड करना है या नहीं।

मुझे जिन विशेष पात्रों से निपटने की आवश्यकता है, उनके साथ क्या करना सही है?


19
आपके दोनों उदाहरण UTF-8 के रूप में एन्कोड किए गए हैं। पहली निश्चित रूप से लैटिन -1 नहीं, यह देखते हुए कि यह तीन बाइट्स लंबा है ...
जैकब बोर्ग

2
UTF-8 में "ब्लैक हार्ट सूट" के बाइट मूल्यों के लिए% E2% 99% A5 हेक्स है । वह काला दिल लैटिन -1 वर्ण सेट का हिस्सा नहीं है ।
हॉके पार्कर

मज़बूती से यह देखने के लिए कि कोई ब्राउज़र कैसे और क्या एन्कोडिंग है (और बहुत सी अन्य उपयोगी जानकारी), अधिकांश आधुनिक ब्राउज़र में निर्मित डेवलपर टूल का उपयोग करें, या फ़िडलर की तरह एक मुफ़्त HTTP डिबगर प्राप्त करें ।
हॉके पार्कर

जवाबों:


65

मैं हमेशा UTF-8 में रहता हूँ। प्रतिशत एन्कोडिंग पर विकिपीडिया पृष्ठ से :

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

ऐसा लगता है क्योंकि अतीत में URL एन्कोडिंग करने के अन्य स्वीकृत तरीके थे, ब्राउज़र URI को डिकोड करने के कई तरीकों का प्रयास करते हैं, लेकिन यदि आप एन्कोडिंग कर रहे हैं तो आपको UTF-8 का उपयोग करना चाहिए।


8
UTF-8 का भी उपयोग किया जाना चाहिए क्योंकि यह नए IRI मानक (RFC 3987, tools.ietf.org/html/rfc3986 ) द्वारा अनुमत एकमात्र एन्कोडिंग है जो पुराने URL मानक की जगह ले रहा है।
रेमी लेबेऊ

3
यदि मैं जैसा भी था, अन्य लोग आश्चर्यचकित हैं, तो @ रेमीलेब्यू की टिप्पणी में इस लेख में RFC3987 का उल्लेख है, लेकिन लिंक पुराने युक्ति 3896 पर है। सही URL स्पष्ट रूप से tools.ietf.org/html/rfc3987
tripleee

हाँ, इस बारे में खेद है। यूआरआई RFC 3986 द्वारा परिभाषित किया गया है, IRI आरएफसी 3987. द्वारा परिभाषित किया गया है
रेमी Lebeau

10

सामान्य नियम से ऐसा लगता है कि ब्राउज़र उस फ़ॉर्म-प्रतिक्रिया के अनुसार सांकेतिक रूप से पृष्ठ की सामग्री-प्रकार के अनुसार काम करता है, जिससे फ़ॉर्म सेवा की गई थी। यह एक अनुमान है कि यदि सर्वर हमें "टेक्स्ट / xml; चारसेट = iso-8859-1" भेजता है, तो वे उसी प्रारूप में वापस प्रतिक्रियाओं की अपेक्षा करते हैं।

यदि आप केवल URL बार में URL दर्ज कर रहे हैं, तो ब्राउज़र में काम करने के लिए आधार पृष्ठ नहीं है और इसलिए केवल अनुमान लगाना है। तो इस मामले में यह हर समय utf-8 कर रहा है (क्योंकि आपके दोनों इनपुट ने तीन-ऑक्टेट फॉर्म वैल्यू का उत्पादन किया है)।

दुखद सच्चाई यह है कि एएफएआईके में कोई मानक नहीं है कि किस चरित्र को क्वेरी स्ट्रिंग में मान सेट करें, या वास्तव में URL के किसी भी वर्ण के रूप में व्याख्या की जानी चाहिए। क्वेरी स्ट्रिंग में मूल्यों के मामले में कम से कम, वहाँ लगता है कि वे आवश्यक रूप से कोई कारण नहीं है कर पात्रों के अनुरूप हैं।

यह एक ज्ञात समस्या है कि आपको अपना सर्वर फ्रेमवर्क बताना है कि कौन सा वर्ण सेट करता है जिससे आप क्वेरी स्ट्रिंग को एन्कोडेड करने की अपेक्षा करते हैं --- उदाहरण के लिए, टॉमकैट में, आपको अनुरोध करना होगा। इससे पहले कि आप (या कुछ इसी तरह की विधि) को शुरू कर दें। किसी भी request.getParameter () के तरीकों को कॉल करें। इस विषय पर प्रलेखन की कमी शायद कई डेवलपर्स के बीच समस्या के बारे में जागरूकता की कमी को दर्शाती है। (मैं नियमित रूप से जावा साक्षात्कारकर्ताओं से पूछता हूं कि एक रीडर और एक इनपुटस्ट्रीम के बीच अंतर क्या है, और नियमित रूप से खाली दिखता है)


6
RFC 3987 ( tools.ietf.org/html/rfc3986 ) एक मानक एन्कोडिंग को परिभाषित करता है - UTF-8 का उपयोग तब किया जाना चाहिए जब एन्कोडिंग वर्ण जो अन्यथा अनएन्कोड किए गए न हों।
रेमी लेबू

8

IRI ( RFC 3987 ) URI / URL ( RFC 3986 और पुराने) मानकों को बदलने वाला नवीनतम मानक है । यूआरआई / यूआरएल यूनिकोड का समर्थन नहीं करते हैं (ठीक है, आरएफसी 3986 भविष्य यूआरआई / यूआरएल-आधारित प्रोटोकॉल के लिए प्रावधान करता है इसका समर्थन करने के लिए, लेकिन पिछले आरएफसी को अपडेट नहीं करता है)। "% UXXXX" योजना कुछ स्थितियों में यूनिकोड की अनुमति देने के लिए एक गैर-मानक विस्तार है, लेकिन सभी द्वारा सार्वभौमिक रूप से लागू नहीं किया गया है। दूसरी ओर, IRI, पूरी तरह से यूनिकोड का समर्थन करता है, और इसके लिए आवश्यक है कि टेक्स्ट को UTF-8 के रूप में पहले प्रतिशत एनकोडेड किया जाए।


मैं प्रोटोकॉल के लिए एक अद्यतन देखना चाहता हूं ताकि यूनिकोड को प्रतिशत-एन्कोडिंग के माध्यम से ही नहीं, यूआरएल में भी पूरी तरह से समर्थन मिले।
मथिउ जे।

1
आईआरआई अन-कोडित यूनिकोड वर्णों के लिए अनुमति देता है, कुछ मामलों को छोड़कर जहां आरक्षित वर्णों को एन्कोड किया जाना चाहिए।
रेमी लेबेउ

6

आईआरआई यूआरआई की जगह नहीं लेते हैं, क्योंकि केवल यूआरआई (प्रभावी रूप से, एएससीआईआई) HTTP सहित कुछ संदर्भों में स्वीकार्य हैं।

इसके बजाय, आप एक आईआरआई निर्दिष्ट करते हैं और यह तार पर निकलते समय एक यूआरआई में बदल जाता है।


0

पहला सवाल यह है कि आपकी जरूरतें क्या हैं? UTF-8 एन्कोडिंग सस्ते संपादक के साथ बनाए गए पाठ को लेने और भाषाओं की एक विस्तृत विविधता के लिए एक बहुत अच्छा समझौता है। एन्कोडिंग की पहचान करने वाले ब्राउज़र के संबंध में, प्रतिक्रिया (वेब ​​सर्वर से) ब्राउज़र को एन्कोडिंग बताएगी। अभी भी अधिकांश ब्राउज़र अनुमान लगाने का प्रयास करेंगे, क्योंकि यह या तो लापता है या इतने मामलों में गलत है। वे परिणाम स्ट्रीम की कुछ मात्रा को देखकर अनुमान लगाते हैं कि क्या कोई ऐसा चरित्र है जो डिफ़ॉल्ट एन्कोडिंग में फिट नहीं होता है। वर्तमान में सभी ब्राउज़र (! मैंने इसे चेक नहीं किया था, लेकिन यह सत्य के बहुत करीब है) डिफ़ॉल्ट के रूप में utf-8 का उपयोग करें।

इसलिए utf-8 का उपयोग करें जब तक कि आपके पास कई अन्य एन्कोडिंग योजनाओं में से एक का उपयोग करने के लिए एक सम्मोहक कारण न हो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.