2010-04-03 14 views
7

मैं जेसन को यूनिकोड टेक्स्ट के साथ उपयोग कर रहा हूं, और आईई 8 देशी जेसन कार्यान्वयन में समस्या है।IE8 देशी जेसन में वर्ण एन्कोडिंग को कैसे सही करें?

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<script> 
    var stringified = JSON.stringify("สวัสดี olé"); 
    alert(stringified); 
</script> 

json2.js या फ़ायर्फ़ॉक्स देशी json का उपयोग करना, alert() स्ट्रिंग मूल एक के समान ही है। दूसरी तरफ IE8 मूल पाठ \u0e2a\u0e27\u0e31\u0e2a\u0e14\u0e35 ol\u00e9 के बजाय यूनिकोड मान देता है। क्या IE को दूसरों की तरह व्यवहार करने का कोई आसान तरीका है, या इस स्ट्रिंग को यह कैसे परिवर्तित करना चाहिए? और क्या आप इसे आईई में एक बग के रूप में मानेंगे, मैंने सोचा था कि देशी जेसन कार्यान्वयन को json2.js के लिए समान प्रतिस्थापन में गिराया जाना चाहिए था?

संपादित करें: इसके बाद के संस्करण कोड का उपयोग कर jsfiddle पर एक रेप्रो - http://jsfiddle.net/vV4uz/

+0

यह इंटरनेट एक्सप्लोरर में एक स्पष्ट बग है: JSON को यूनिकोड एन्कोडेड माना जाना चाहिए, [आरएफसी 4627] (http://www.ietf.org/rfc/rfc4627.txt) – rds

उत्तर

7

अपने स्वयं के प्रश्न का उत्तर देने के लिए - जाहिर है यह IE8 में मूल रूप से संभव नहीं है, लेकिन यह IE9 बीटा में सही ढंग से काम करता है।

एक fix हालांकि संभव है:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<script> 
    var stringified = JSON.stringify("สวัสดี olé"); 
    stringified = unescape(stringified.replace(/\\u/g, '%u')); 
    alert(stringified); 
</script> 

कौन सा होगा सही ढंग से चेतावनी() वापस आईई, एफएफ और क्रोम के सभी पर मूल स्ट्रिंग।

+0

अजीब। मैंने अपनी साइट के लिए http://www.browserstack.com/ पर एक नज़र डाली है, और आईई 6-10 के सभी संस्करणों पर असर पड़ता है – rds

1

यह है सर्वर को भेजने से पहले, आप सांकेतिक शब्दों में बदलना कर सकते हैं यह पहली encodeURIComponent (JSON.stringify ("สวัสดี olé")) और उपयोग करते हैं सर्वर पर एक utf8 डिकोडर

+0

धन्यवाद। यदि आवश्यकता हो तो मुझे सर्वर पर डिकोडिंग करने पर कोई फर्क नहीं पड़ता, हालांकि यह आदर्श नहीं है क्योंकि इसका मतलब यह होगा कि सर्वर का उपयोग किस ब्राउज़र पर किया जा रहा था, इस पर निर्भर करता है। फिर मैं "सर्वर पर इसे 8 डीकोड कैसे करूंगा" हालांकि (सी # में), मैं अभी भी थोड़ा खो गया हूं ...? सर्वर पर भेजते समय मैं पहले से ही encodeURIComponent का उपयोग करता हूं, लेकिन यह वास्तव में समस्या को नहीं बदलता है। – mikel

+0

http://briancaos.wordpress.com/2009/03/31/decodeuricomponent-equivalent-in-c/ मुझे नहीं लगता कि ब्राउज़र, आईई और एफएफ के आधार पर आपको अलग-अलग डेटा क्यों मिलेगा, दोनों समर्थन encodeURIComponent – mplungjan

+0

डेटा पारित किया गया ब्राउज़र पर निर्भर करता है (मूल प्रश्न के रूप में), इसलिए आउटपुट भी अलग है।encodeURIComponent बस मुझे क्लाइंट से सर्वर पर समस्या को स्थानांतरित करने देता है, लेकिन मैं अभी भी सर्वर पर क्लाइंट या सी # पर जावास्क्रिप्ट के साथ समस्या को सही करने का एक तरीका ढूंढ रहा हूं। – mikel

0

सुनिश्चित करें कि आपका सर्वर ठीक से कॉन्फ़िगर किया गया है। मेरा जवाब दे गया था, यहां तक ​​कि यूनिकोड JSON फ़ाइलों के लिए:

Content-Type: text/html; charset=ISO-8859-1 
0

मुझे लगता है कि regexp:

अनएस्केप (stringified.replace (/ \ यू/जी, '% यू'));

बहुत आक्रामक है। यदि आपके इनपुट में स्ट्रिंग '\ u' था जो यूटीएफ चरित्र नहीं था, तो यह अभी भी इसे पकड़ लेगा।

मुझे लगता है कि आप की जरूरत यह है:

अनएस्केप (stringified.replace (/ ([^ \\]) \\ यू ([0-9] [0-9] [0-9 ] [0-9])/जी, "$ 1% u $ 2"));

यह एक्स \ nuxxxx अनुक्रमों को केवल तभी बदल देगा यदि एक्स एक अंक है और संपूर्ण अनुक्रम बैकस्लैश (\) द्वारा आगे नहीं बढ़ता है।

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