2013-05-25 14 views
8

विकसित चश्मा पढ़ने से सालों में मैंने माना था कि RFC 3986 अंततः बचने के ऑक्टेट अनुक्रमों के लिए यूटीएफ -8 एन्कोडिंग पर बस गया था। यही है, अगर मेरे यूआरआई में %XX%YY%ZZ है, तो मैं डीकोडेड ऑक्टेट्स (योजना-विशिष्ट भाग में किसी भी यूआरआई के लिए) का अनुक्रम ले सकता हूं और परिणामस्वरूप बाइट्स को यूटीएफ -8 के रूप में समझ सकता हूं कि यह पता लगाने के लिए कि किस डिकोडेड जानकारी का इरादा था। व्यावहारिक रूप से, मैं जावास्क्रिप्ट decodeURIComponent() पर कॉल कर सकता हूं जो मेरे लिए यह डिकोडिंग स्वचालित रूप से करता है।डेटा में वर्णसेट यूआरआई

तब मैं data: यूआरआई, RFC 2397 है, जो एक charset तर्क है, जो (स्वाभाविक रूप से) इनकोडिंग डेटा के चारसेट इंगित करता है भी शामिल है के लिए कल्पना पढ़ें। लेकिन यह कैसे काम करता है? अगर मेरे पास data: यूआरआई में दो-ऑक्टेट एन्कोडेड अनुक्रम %XX%YY है, तो charset=iso-8859-1 इंगित करता है कि दो डीकोडेड ऑक्टेट्स को यूटीएफ -8 अनुक्रम के रूप में व्याख्या नहीं किया जाना चाहिए, लेकिन दो अलग लैटिन वर्णों के रूप में (जैसा कि आईएसओ में प्रत्येक बाइट -885 9 -1 एक चरित्र का प्रतिनिधित्व करता है)? आरएफसी 2397 इस से संकेत मिलता है, के रूप में यह "ग्रीक [वैसा] वर्ण" का एक उदाहरण देता है लगता है:

data:text/plain;charset=iso-8859-7,%be%fg%be 

लेकिन इसका मतलब है कि जावास्क्रिप्ट decodeURIComponent() (जो UTF-8 एन्कोडेड ओक्टेट्स मान लिया गया है) निकालने के लिए इस्तेमाल नहीं किया जा सकता एक डेटा यूआरआई से एक स्ट्रिंग, सही? क्या इसका मतलब है कि अगर डेटा यूआरएफ -8 के अलावा कुछ है तो मुझे डेटा यूआरआई के लिए अपना खुद का डिकोडिंग बनाना होगा?

इसके अलावा, क्या इसका मतलब यह है कि आरएफसी 23 9 7 अब आरएफसी 3 9 86 के साथ संघर्ष में है, जो इंगित करता है कि यूटीएफ -8 माना जाता है? या आरएफसी 3 9 86 में केवल "नई यूआरआई योजना" का संदर्भ है, जिसका अर्थ है कि data: यूआरआई योजना में दादा हो गया है और यह निर्धारित करने के लिए अपनी तकनीक है कि एन्कोडेड ऑक्टेट्स का क्या अर्थ है?

इस समय मेरे लिए सबसे अच्छा अनुमान है कि data: नाटकों अपने नियम से और अगर यह UTF-8 के अलावा किसी अन्य चारसेट इंगित करता है, मैं जावास्क्रिप्ट में decodeURIComponent() के अलावा कुछ का उपयोग करना होगा है। प्रतिस्थापन विधि पर किसी भी सिफारिश का स्वागत भी किया जाएगा।

उत्तर

5

याद रखें कि data: URI योजना एक संसाधन है कि एक अपारदर्शी bytestream बस के रूप में हालांकि यह एक http: यूआरआई थे के होते हैं जो एक फ़ाइल के रूप में के बारे में सोचा जा सकता है (एक ही bytestream, लेकिन संग्रहीत एक HTTP सर्वर पर) या एक ftp: का वर्णन करता है यूआरआई (वही बाइटस्ट्रीम, लेकिन एक एफ़टीपी सर्वर पर संग्रहीत) या file: यूआरआई (वही बाइटस्ट्रीम, लेकिन आपके स्थानीय फाइल सिस्टम पर संग्रहीत)। फ़ाइल से जुड़ा मेटाडेटा केवल बाइटस्ट्रीम अर्थ देता है।

आरएफसी 23 9 7 यूआरआई में इस बाइटस्ट्रीम को कैसे एम्बेड किया जाए, इस बारे में एक स्पष्ट विनिर्देश देता है (अन्य यूआरआई योजनाओं के विपरीत, जहां यूआरआई बाइटस्ट्रीम लाने के लिए निर्देश देता है, इसमें क्या नहीं है)। यह बेस 64 हो सकता है या यह आरएफसी में दी गई प्रतिशत-एन्कोडिंग विधि हो सकती है। बेस 64 में अधिक कॉम्पैक्ट होने जा रहा है यदि बायस्ट्रीम में मैन गैर-एएससीआईआई बाइट्स शामिल हैं।

data: यूआरआई अपने स्वयं के सामग्री-प्रकार का भी वर्णन करता है, जो बाइटस्ट्रीम की इच्छित व्याख्या देता है। इस मामले में, चूंकि आपने text/plain;charset=iso-8859-7 का उपयोग किया है, बाइट्स को ISO-8859-7 टेक्स्ट को सही ढंग से एन्कोड किया जाना चाहिए। बाइट निश्चित रूप से नहीं को यूटीएफ -8 या किसी अन्य चरित्र एन्कोडिंग के रूप में तय किया जाएगा। आपके द्वारा निर्दिष्ट वर्ण एन्कोडिंग का उपयोग करके इसे अनजाने में डीकोड किया जाएगा।

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