2011-03-22 19 views
43

मैं जो jQuery के साथ फ़ाइलें .json प्राप्त करता है और वेबपेज एम्बेड किया में डेटा injects एक जावास्क्रिप्ट एप्लिकेशन बना रहा हूं।मैं विशेष यूटीएफ -8 वर्णों को जावास्क्रिप्ट का उपयोग करके अपने आईएसओ -885 9 -1 समकक्ष में कैसे परिवर्तित करूं?

.json फ़ाइलें UTF-8 के साथ इनकोड और उच्चारण é, ö और तरह वर्ण शामिल ए।

समस्या यह है कि मैं ऐप का उपयोग करने वाले पृष्ठों पर वर्णमाला को नियंत्रित नहीं करता हूं।

कुछ यूटीएफ -8 का उपयोग करेंगे, लेकिन अन्य आईएसओ -885 9 -1 वर्णमाला का उपयोग करेंगे। यह निश्चित रूप से .json फ़ाइलों से विशेष वर्णों को गले लगाएगा।

मैं विशेष यूटीएफ -8 वर्णों को जावास्क्रिप्ट का उपयोग करके अपने आईएसओ -885 9 -1 समकक्ष में कैसे परिवर्तित करूं?

उत्तर

119

असल में, सबकुछ आम तौर पर आंतरिक रूप से किसी प्रकार के यूनिकोड के रूप में संग्रहीत होता है, लेकिन इसमें शामिल नहीं होने देता है। मुझे लगता है कि आपको प्रतिष्ठित "à ¥ ÃÆ'à ¢ एक प्रकार का तार मिल रहा है क्योंकि आप अपने चरित्र एन्कोडिंग के रूप में एक आईएसओ -885 9 का उपयोग कर रहे हैं। एक चाल है जो आप उन पात्रों को बदलने के लिए कर सकते हैं। escape और unescape एन्कोडिंग और डिकोडिंग क्वेरी स्ट्रिंग के लिए प्रयुक्त फ़ंक्शंस को आईएसओ वर्णों के लिए परिभाषित किया गया है जबकि नए encodeURIComponent और decodeURIComponent जो एक ही काम करते हैं, को यूटीएफ 8 अक्षरों के लिए परिभाषित किया गया है।

escape encodes विस्तारित ISO-8859-1 वर्ण (UTF कोड अंक U + 0080-U + 00ff) %xx (दो अंकों हेक्स) जबकि वह कूटबद्ध रूप में UTF कोड पॉइंट्स U + 0100 और इसके बाद के संस्करण के रूप में %uxxxx (%u चार के बाद -डिजिट हेक्स।) उदाहरण के लिए, escape("å") == "%E5" और escape("あ") == "%u3042"

encodeURIComponent प्रतिशत-एन्कोड विस्तारित वर्णों को यूटीएफ 8 बाइट अनुक्रम के रूप में विस्तारित करता है। उदाहरण के लिए, encodeURIComponent("å") == "%C3%A5" और encodeURIComponent("あ") == "%E3%81%82"

तो तुम कर सकते हैं:

fixedstring = decodeURIComponent(escape(utfstring)); 

उदाहरण के लिए, एक गलत तरीके से एन्कोड चरित्र 'ए' बन जाता है "एक ¥"। आदेश escape("Ã¥") == "%C3%A5" करता है जो एकल बाइट्स के रूप में एन्कोड किए गए दो गलत आईएसओ वर्ण हैं। फिर decodeURIComponent("%C3%A5") == "å", जहां दो प्रतिशत-एन्कोडेड बाइट्स को यूटीएफ 8 अनुक्रम के रूप में व्याख्या किया जा रहा है।

आप किसी कारण के लिए रिवर्स, वह भी काम करता है क्या करने की जरूरत हैं, तो:

utfstring = unescape(encodeURIComponent(originalstring)); 

वहाँ बुरा UTF8 तार और तार और आईएसओ के बीच अंतर करने के लिए एक रास्ता है? बाहर निकलता है। उपरोक्त प्रयुक्त डीकोडुरिकोम्पोनेंट फ़ंक्शन एक विकृत एन्कोडेड अनुक्रम दिए जाने पर एक त्रुटि फेंक देगा। हम इसकी एक बड़ी संभावना के साथ पता लगाने के लिए इसका उपयोग कर सकते हैं कि हमारी स्ट्रिंग यूटीएफ 8 या आईएसओ है या नहीं।

var fixedstring; 

try{ 
    // If the string is UTF-8, this will work and not throw an error. 
    fixedstring=decodeURIComponent(escape(badstring)); 
}catch(e){ 
    // If it isn't, an error will be thrown, and we can asume that we have an ISO string. 
    fixedstring=badstring; 
} 
+1

मैंने आपके उत्तर के उत्तर पर आपके उत्तर का संदर्भ दिया है यहां प्रश्न: http://stackoverflow.com/questions/18847191/is-there-a-uniform-method-in-both-php-and-js-to-convert-unicode-characters/18863966#18863966 – hsuk

+0

@nitro : क्या जावास्क्रिप्ट आईएसओ लैटिन के रूप में प्रत्येक यूटीएफ -8 वर्णों को मानता है? – hsuk

+2

'एस्केप' एन्कोड्स आईएसओ -885 9 -1 अक्षरों (यूटीएफ कोड पॉइंट्स यू +0080-यू +00 एफएफ) को '% xx' (दो अंकों वाला हेक्स) के रूप में विस्तारित करते हैं जबकि यह यूटीएफ कोडपॉइंट्स यू +0100 और ऊपर'% uxxxx' के रूप में एन्कोड करता है ('% u' के बाद चार अंकों वाला हेक्स।) उदाहरण के लिए, 'बचें (" å ") =="% E5 "' और' escape ("あ") == "% u3042" '। 'encodeURIComponent' प्रतिशत-एन्कोड विस्तारित वर्णों को यूटीएफ 8 बाइट अनुक्रम के रूप में। उदाहरण के लिए, 'encodeURIComponent (" å ") =="% C3% A5 "' और 'encodeURIComponent (" あ ") =="% E3% 81% 82 "'। मुझे आशा है कि किसी भी प्रश्न को साफ़ कर देगा। – nitro2k01

7

समस्या यह है कि एक बार पृष्ठ परोसा जाने के बाद, सामग्री सामग्री-प्रकार मेटा टैग में वर्णित एन्कोडिंग में होगी। "गलत" एन्कोडिंग में सामग्री पहले से ही खराब है।

पृष्ठ की सेवा करने से पहले सर्वर पर ऐसा करने के लिए आप सबसे अच्छे हैं। या जैसा कि मुझे यह कहना है: यूटीएफ -8 अंत-टू-एंड या मर

+0

हालांकि मेरा पेज हेडर पहले से ही यूटीएफ -8 पर कहता है, मुझे इसे आगे एन्क्रिप्शन के लिए आईएसओ लैटिन में परिवर्तित करना पड़ा। http://stackoverflow.com/questions/18786025/mcrypt-js-encryption-value-is- अलग-than-that-produced-by-php-mcrypt-mcryp – hsuk

1

आंतरिक रूप से, जावास्क्रिप्ट तार कर रहे हैं सभी यूनिकोड (वास्तव में यूसीएस -2, UTF-16 के एक सबसेट)।

यदि आप AJAX के माध्यम से जेएसओएन फ़ाइलों को अलग से पुनर्प्राप्त कर रहे हैं, तो आपको केवल यह सुनिश्चित करने की आवश्यकता है कि JSON फ़ाइलों को सही सामग्री-प्रकार और वर्णमाला के साथ परोसा जाता है: Content-Type: application/json; charset="utf-8")। यदि आप ऐसा करते हैं, तो जब आप deserialized वस्तुओं तक पहुंचते हैं, तो jQuery ने पहले से ही उन्हें ठीक से व्याख्या करनी चाहिए।

क्या आप जेएसओएन ऑब्जेक्ट्स को पुनर्प्राप्त करने के लिए उपयोग कर रहे कोड का एक उदाहरण पोस्ट कर सकते हैं?

+0

यह अप्रासंगिक है, दोनों केवल सामग्री-प्रकार या वर्णमाला को सेट करते हैं: jQuery ने उसी तरह से सेवा किए गए जेसन को उसी तरह व्याख्या किया है। शायद क्योंकि spec (http://www.ietf.org/rfc/rfc4627.txt) कहता है कि 'JSON टेक्स्ट यूनिकोड में एन्कोड किया जाएगा। डिफ़ॉल्ट एन्कोडिंग यूटीएफ -8' है। तो शीर्षलेख को 'सामग्री-प्रकार: एप्लिकेशन/जेसन' पर सेट करना; charset = "iso-8859-1" 'एक चर से जेसन एन्कोडिंग टेक्स्ट के बाद आईएसओ -885 9 -1 में एन्कोड की गई फ़ाइल से मिलता है और इसे एज़ो -885 9 -1 एन्कोडेड एचटीएमएल पेज पर AJAX द्वारा भेजकर उसी परिणाम का उत्पादन होता है जो निर्दिष्ट नहीं करता है कुछ भी: ब्राउज़र द्वारा स्ट्रिंग को 'NULL' – Pere

-1

आप अपने पृष्ठ

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
+0

के रूप में व्याख्या किया जा रहा है क्या इस उत्तर में कुछ विवरण गुम हैं? –

1

ऊपर इस लाइन जोड़ने चाहिए कैसे ISO-8859-1 से UTF-8 में बदलने के लिए पर question के बाद से बंद कर दिया है क्योंकि यह एक की मैं अपने समाधान पोस्ट करने के लिए जा रहा हूँ यहाँ।

समस्या तब होती है जब आप XMLHttpRequest का उपयोग करके कुछ भी प्राप्त करने का प्रयास करते हैं, यदि XMLHttpRequest.responseType "टेक्स्ट" या खाली है, तो XMLHttpRequest.response को DOMString में बदल दिया गया है और यह चीजें टूट गई हैं। इसके बाद, उस स्ट्रिंग के साथ विश्वसनीय रूप से काम करना लगभग असंभव है।

अब, यदि सर्वर से सामग्री आईएसओ -885 9 -1 है तो आपको प्रतिक्रिया को "Blob" प्रकार के रूप में मजबूर करना होगा और बाद में इसे DOMSTring में परिवर्तित करना होगा। उदाहरण के लिए:

var ajax = new XMLHttpRequest(); 
ajax.open('GET', url, true); 
ajax.responseType = 'blob'; 
ajax.onreadystatechange = function(){ 
    ... 
    if(ajax.responseType === 'blob'){ 
     // Convert the blob to a string 
     var reader = new window.FileReader(); 
     reader.addEventListener('loadend', function() { 
      // For ISO-8859-1 there's no further conversion required 
      Promise.resolve(reader.result); 
     }); 
     reader.readAsBinaryString(ajax.response); 
    } 
} 

लगता है जादू की तरह readAsBinaryString पर हो रहा है तो शायद किसी को यह क्यों काम करता है पर कुछ प्रकाश डाला सकता है।

0

मैं इस उत्तर के लिए देख रहा था, लेकिन कई कोड के खिलाफ एक पंक्ति में लगता है, कुछ इस तरह हो सकता है:

var converted = "<?php echo mb_convert_encoding($str_to_convert, 'UTF-8', 'ISO-8859-1'); ?>"; 

वह मेरे लिए काम किया, लेकिन आप इस तरह से, php में वर डाल अगर:

document.write("<?php $str_to_convert = " + your_str + " ?>"); 

उम्मीद है कि यह किसी को भी मदद करता है।

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