JSON वर्ण एन्कोडिंग - UTF-8 ब्राउज़रों द्वारा अच्छी तरह से समर्थित है या मुझे संख्यात्मक एस्केप दृश्यों का उपयोग करना चाहिए?


89

मैं एक webservice लिख रहा हूँ जो अपने संसाधनों का प्रतिनिधित्व करने के लिए json का उपयोग करता है, और मैं json को एन्कोड करने के सर्वोत्तम तरीके के बारे में सोचकर थोड़ा अटक गया हूं। Json rfc ( http://www.ietf.org/rfc/rfc4627.txt ) पढ़ना यह स्पष्ट है कि पसंदीदा एन्कोडिंग utf-8 है। लेकिन rfc वर्णों को निर्दिष्ट करने के लिए एक स्ट्रिंग एस्केपिंग तंत्र का भी वर्णन करता है। मुझे लगता है कि यह आम तौर पर गैर-अस्की पात्रों से बचने के लिए उपयोग किया जाता है, जिससे परिणामी utf-8 वैध आस्की बनती है।

तो मान लें कि मेरे पास एक जस स्ट्रिंग है जिसमें यूनिकोड वर्ण (कोड-पॉइंट) हैं जो गैर-एससीआई हैं। क्या मेरा webservice सिर्फ utf-8 को एन्कोडिंग करता है और इसे वापस करना चाहिए, या क्या यह उन सभी गैर-अस्सी के पात्रों से बचना चाहिए और शुद्ध अस्की वापस करना चाहिए?

मुझे लगता है कि ब्राउज़र jsonp या eval का उपयोग करके परिणामों को निष्पादित करने में सक्षम होना चाहते हैं। क्या इससे निर्णय प्रभावित होता है? Utf-8 के लिए विभिन्न ब्राउज़र की जावास्क्रिप्ट समर्थन के बारे में मेरी जानकारी में कमी है।

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

जवाबों:


88

JSON युक्ति को डिकोडर्स द्वारा UTF-8 समर्थन की आवश्यकता होती है । नतीजतन, सभी JSON डिकोडर UTF-8 को संभाल सकते हैं और साथ ही वे संख्यात्मक एस्केप अनुक्रम को भी संभाल सकते हैं। यह जावास्क्रिप्ट व्याख्याकारों के लिए भी मामला है, जिसका अर्थ है कि JSONP UTF-8 एनकोडेड JSON को भी संभाल लेगा।

JSON एन्कोडर के लिए संख्यात्मक बच अनुक्रमों का उपयोग करने की बजाय सिर्फ आपको अधिक विकल्प प्रदान करता है। यदि आप सांख्यिक पलायन अनुक्रम चुन सकते हैं तो एक कारण यह होगा कि यदि आपके एन्कोडर और इच्छित डिकोडर के बीच परिवहन तंत्र द्विआधारी-सुरक्षित नहीं है।

एक और कारण जो आप न्यूमेरिक एस्केप सीक्वेंस का उपयोग करना चाहते हैं, वह है स्ट्रीम में दिखाई देने वाले कुछ कैरेक्टर को रोकना, जैसे कि <, &और ", जिसे HTML सीक्वेंस के रूप में व्याख्या किया जा सकता है यदि JSON कोड को HTML में भागने के बिना रखा गया है या कोई ब्राउज़र गलत तरीके से HTML की व्याख्या करता है । यह HTML इंजेक्शन या क्रॉस-साइट स्क्रिप्टिंग के खिलाफ एक बचाव हो सकता है (ध्यान दें: कुछ वर्णों को JSON में शामिल किया जाना चाहिए, जिसमें शामिल हैं "और \)।

PHP के JSON के कार्यान्वयन सहित कुछ चौखटे, हमेशा ASCII के बाहर किसी भी वर्ण के लिए एनकोडर पक्ष पर संख्यात्मक एस्केप अनुक्रम करते हैं। यह सीमित परिवहन तंत्र और पसंद के साथ अधिकतम अनुकूलता के लिए है। हालांकि, इसे एक संकेत के रूप में नहीं समझा जाना चाहिए कि JSON डिकोडर्स को UTF-8 के साथ समस्या है।

इसलिए, मुझे लगता है कि आप यह तय कर सकते हैं कि इस तरह से किसका उपयोग करना है:

  • बस यूटीएफ -8 का उपयोग करें, जब तक कि एनकोडर और डिकोडर के बीच भंडारण या परिवहन का आपका तरीका बाइनरी-सुरक्षित नहीं है।

  • अन्यथा, संख्यात्मक एस्केप दृश्यों का उपयोग करें।


1
"सभी JSON डिकोडर UTF-8 को संभाल सकते हैं" जबकि यह ब्राउज़रों का सच है, सिर्फ इसलिए कि मानक की आवश्यकता है इसका मतलब यह नहीं है कि JSON का सभी सॉफ़्टवेयर डिकोडिंग UTF-8 का समर्थन करता है।
माइकल जूनियर

7
"सभी JSON डिकोडर UTF-8 को संभाल सकते हैं" अक्षरशः सत्य है। अगर कुछ UTF-8 को स्वीकार नहीं कर सकता है, तो यह JSON डिकोडर नहीं है। यह JSON डिकोडर के समान हो सकता है, लेकिन यह निश्चित रूप से एक नहीं है।
थोमसट्रेटर

मुझे लगता है कि JSON डिकोडर की आप क्या परिभाषा का उपयोग कर रहे हैं पर निर्भर करता है, लेकिन उचित बिंदु :)
माइकल Mior

RFC 8259 कारण UTF-8 समर्थन को अनिवार्य बताता है कि यह वही है जिसे दुनिया ने मानकीकृत किया है। पिछले अप्रचलित चश्मे ने यूनिकोड के रूप में तार को परिभाषित किया, लेकिन जो एन्कोडिंग को निर्दिष्ट नहीं करता था; यूटीएफ -8 पर वैसे भी कार्यान्वित मानकीकरण और अद्यतन की गई कल्पना दर्शाती है।
थोमसट्रेटर

UTF-8 का समर्थन उस RFC में किसी विशेष सॉफ़्टवेयर के लिए अनिवार्य नहीं है जहाँ तक मैं बता सकता हूँ। UTF-8 का एकमात्र उल्लेख यह है कि इसका उपयोग JSON के लिए एन्कोडिंग के रूप में बंद सिस्टम के बाहर किया जाना चाहिए। इसका मतलब यह नहीं है कि सभी JSON डिकोडर (RFC में इस्तेमाल नहीं की जाने वाली भाषा) को UTF-8 का समर्थन करना चाहिए।
माइकल जूनियर

17

मुझे वहाँ एक समस्या थी। जब मैं JSON "é" जैसे चरित्र के साथ एक स्ट्रिंग को एन्कोड करता हूं, तो प्रत्येक ब्राउज़र IE को छोड़कर उसी "é" को लौटा देगा, जो "\ u00e9" वापस आ जाएगा।

फिर PHP json_decode () के साथ, यह विफल हो जाएगा यदि यह "é" लगता है, तो फ़ायरफ़ॉक्स, ओपेरा, सफारी और क्रोम के लिए, मुझे json_decode () से पहले utf8_encode () कॉल करना होगा।

नोट: मेरे परीक्षणों के साथ, IE और फ़ायरफ़ॉक्स अपनी मूल JSON ऑब्जेक्ट का उपयोग कर रहे हैं, अन्य ब्राउज़र json2.js का उपयोग कर रहे हैं।


10
संभवतः आपका मतलब है utf8_encode(), php.net/manual/en/function.utf8-encode.php
Binyamin

4
यदि IE को डिकोड करने में विफल हो रहा है, तो यह JSON डिकोडर में एक बग है जो आप उपयोग कर रहे हैं। सभी JSON डिकोडर्स को एन्कोडेड फॉर्म को सफलतापूर्वक डिकोड करना चाहिए, या वे JSON डिकोडर नहीं हैं। के साथ अपने मुद्दे के लिए jes_decode () के साथ es unescaped, यह संभव है कि जिस पाठ को आप खिला रहे हैं वह UTF-8 नहीं है। JSON डिकोडर हमेशा UTF-8, यहां तक ​​कि PHP कार्यान्वयन, भले ही PHP आम तौर पर कई अन्य कार्यों में UTF-8 ग्रहण नहीं करता है। अन्य चरित्र एनकोडिंग हैं जो स्क्रीन पर एक समान हो सकते हैं और समान दिख सकते हैं, लेकिन जो यूटीएफ -8 नहीं हैं। \ UXXXX फॉर्म में एनकोडिंग इसका एक समाधान है।
थोमसट्रेटर

केवल यह कहकर: JSON कानूनी रूप से किसी भी यूनिकोड एन्कोडिंग (UTF-8, UTF-16 BE / LE, UTF32 BE / LE, बाइट ऑर्डर मार्कर के साथ या बिना) में आ सकता है। और चूंकि ASCII UTF-8 का सबसेट है, इसलिए यह ASCII में भी आ सकता है। उदाहरण के लिए क्या यूटीएफ -32 स्वीकार करते हैं, मुझे नहीं पता।
gnasher729

1
यह सही है, और parsers को UTF-8 के अलावा किसी अन्य चीज का समर्थन करने की आवश्यकता नहीं है। कल्पना से: "JSON टेक्स्ट SHALL को UTF-8, UTF-16, या UTF-32 में इनकोड किया जा सकता है। डिफ़ॉल्ट एन्कोडिंग UTF-8 है, और JSON पाठ जो UTF-8 में एन्कोड किए गए हैं, इस अर्थ में इंटरऑपरेबल हैं। अधिकतम संख्या में कार्यान्वयन द्वारा सफलतापूर्वक पढ़ा जा सकता है; ऐसे कई कार्यान्वयन हैं जो अन्य एन्कोडिंग (जैसे UTF-16 और UTF-32) में सफलतापूर्वक पाठ नहीं पढ़ सकते हैं। कार्यान्वयन एक JSON पाठ की शुरुआत में एक बाइट क्रम चिह्न नहीं जोड़ना चाहिए। "
थोमसट्रेटर

@thomasrutter आपके द्वारा उद्धृत किया गया युक्ति पुराना है। वर्तमान कल्पना कहते हैं: " JSON टेक्स्ट प्रणाली है कि एक बंद पारिस्थितिकी तंत्र को UTF-8 का उपयोग कर एन्कोड किया जाना चाहिए का हिस्सा नहीं हैं के बीच आदान-प्रदान किया जब JSON टेक्स्ट संचारण JSON का पिछला विनिर्देशों UTF-8 के उपयोग की आवश्यकता नहीं है हालांकि, विशाल बहुमत।। JSON- आधारित सॉफ़्टवेयर कार्यान्वयनों ने UTF-8 एन्कोडिंग का उपयोग करने के लिए चुना है, इस हद तक कि यह एकमात्र एन्कोडिंग है जो अंतर्संचालनीयता को प्राप्त करता है। कार्यान्वयन एक नेटवर्क ट्रांसमिट की शुरुआत में बाइट ऑर्डर मार्क (U + FEFF) नहीं जोड़ना चाहिए। JSON पाठ। "
रेमी लेबू

12

ASCII इसमें और नहीं है। UTF-8 एन्कोडिंग का उपयोग करने का अर्थ है कि आप ASCII एन्कोडिंग का उपयोग नहीं कर रहे हैं। RFC क्या कहता है, इसके लिए आपको बचने वाले तंत्र का उपयोग करना चाहिए:

सभी यूनिकोड वर्णों को उद्धरण चिह्नों के अलावा रखा जा सकता है जिन्हें छोड़ना चाहिए


1
यदि वह बोली जो आपने प्रदान की है, तो आप देखेंगे कि आपको सभी यूनिकोड वर्णों से बचने की आवश्यकता नहीं है, केवल कुछ विशेष वर्ण। लेकिन आपको परिणामों को एन्कोड करना आवश्यक है (अधिमानतः utf-8 के साथ)। तो सवाल यह है: "यदि आप utf-8 एन्कोडिंग हैं तो सामान्य यूनिकोड वर्णों से बचने के लिए परेशान क्यों हैं"।
schickb

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

जब आप सामान्य यूनिकोड वर्णों से बचने के लिए परेशान होते हैं, तो वे संदर्भों में होते हैं, जहां वे मेटाचट्रैक्टर्स होते हैं, जैसे तार। (मेरे द्वारा उद्धृत RFC चंक स्ट्रिंग्स के बारे में है; क्षमा करें, इस बारे में स्पष्ट नहीं था।) आपको हर समय ASCII आउटपुट करने की आवश्यकता नहीं है; मुझे लगता है कि टूटे ब्राउज़रों के साथ डिबगिंग के लिए यह अधिक है।
अराजकता

7

मैं उसी समस्या का सामना कर रहा था। इससे मेरा काम बनता है। कृपया इसे जाँचे।

json_encode($array,JSON_UNESCAPED_UNICODE);

यह ध्यान दिया जाना चाहिए कि उपरोक्त PHP है, क्योंकि सवाल किसी भी तरह से PHP- विशिष्ट नहीं है और केवल वेब सेवा के बारे में बात करता है जो PHP का उपयोग नहीं कर सकता है (जैसा कि हमारे पाठकों के पुराने लोग अभी भी याद कर सकते हैं ...)
ntninja

1

Json rfc ( http://www.ietf.org/rfc/rfc4627.txt ) पढ़ना यह स्पष्ट है कि पसंदीदा एन्कोडिंग utf-8 है।

FYI करें, RFC 4627 अब आधिकारिक JSON कल्पना नहीं है। 2014 में RFC 7159 द्वारा इसका पालन किया गया था , जिसे बाद में 2017 में RFC 8259 द्वारा मान लिया गया , जो वर्तमान कल्पना है।

RFC 8259 राज्य:

8.1। अक्षरों को सांकेतिक अक्षरों में बदलना

JSON टेक्स्ट उन प्रणालियों के बीच आदान-प्रदान करता है जो एक बंद पारिस्थितिकी तंत्र का हिस्सा नहीं हैं, उन्हें UTF-8 [RFC369] का उपयोग करके एन्कोड किया जाना चाहिए

JSON के पिछले विनिर्देशों को JSON टेक्स्ट ट्रांसमिट करते समय UTF-8 के उपयोग की आवश्यकता नहीं होती है। हालांकि, JSON- आधारित सॉफ़्टवेयर कार्यान्वयन के विशाल बहुमत ने UTF-8 एन्कोडिंग का उपयोग करने के लिए चुना है, इस हद तक कि यह एकमात्र एन्कोडिंग है जो अंतर-क्षमता प्राप्त करता है।

कार्यान्वयन नेटवर्क द्वारा प्रेषित JSON टेक्स्ट की शुरुआत में बाइट ऑर्डर मार्क (U + FEFF) जोड़ना आवश्यक नहीं है। इंटरऑपरेबिलिटी के हितों में, JSON ग्रंथों को पार्स करने वाले कार्यान्वयन एक बाइट ऑर्डर मार्क की उपस्थिति को एक त्रुटि के रूप में मानने की बजाय उपेक्षा करते हैं।


0

मुझे é char के साथ भी ऐसी ही समस्या थी ... मुझे लगता है कि यह टिप्पणी "यह संभव है कि जो पाठ आप इसे खिला रहे हैं वह UTF-8 नहीं है" शायद यहाँ निशान के करीब है। मुझे लगता है कि मेरे उदाहरण में डिफ़ॉल्ट टकराव कुछ और था जब तक मुझे एहसास नहीं हुआ और utf8 में बदल गया ... समस्या यह है कि डेटा पहले से ही था, इसलिए यह निश्चित नहीं है कि यह डेटा परिवर्तित हुआ या नहीं जब मैंने इसे बदल दिया, तो mysql में ठीक प्रदर्शित होता है कार्यक्षेत्र। अंतिम परिणाम यह है कि php json डेटा को एनकोड नहीं करेगा, बस गलत रिटर्न करता है। इससे कोई फर्क नहीं पड़ता कि आप किस ब्राउज़र को इसके सर्वर के रूप में उपयोग करते हैं, जो मेरी समस्या का कारण बन रहा है, php डेटा को parf8 के लिए पार्स नहीं करेगा यदि यह चार्ट मौजूद है। जैसे कि मुझे यकीन नहीं है कि डेटा मौजूद होने या सिर्फ php बग के बाद स्कीमा को utf8 में बदलने के कारण है। इस मामले में उपयोग करेंjson_encode(utf8_encode($string));

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