2012-02-13 3 views
196

जब मैं अपने आरईएसटी सेवा में जेएसओएन बॉडी के साथ एक POST अनुरोध करता हूं तो मैसेज हेडर में Content-type: application/json; charset=utf-8 शामिल करता है। इस हेडर के बिना, मुझे सेवा से एक त्रुटि मिलती है। मैं ;charset=utf-8 भाग के बिना सफलतापूर्वक Content-type: application/json का भी उपयोग कर सकता हूं।"सामग्री-प्रकार: एप्लिकेशन/जेसन; charset = utf-8" वास्तव में क्या मतलब है?

charset=utf-8 क्या करता है? मुझे पता है कि यह चरित्र एन्कोडिंग निर्दिष्ट करता है लेकिन सेवा इसके बिना ठीक काम करती है। क्या यह एन्कोडिंग उन वर्णों को सीमित करती है जो संदेश निकाय में हो सकती हैं?

+2

दिलचस्प http://www.hanselman.com/blog/WhyTheAskObamaTweetWasGarbledOnScreenKnowYourUTF8UnicodeASCIIAndANSIDecodingMrPresident.aspx –

+4

पर एक नज़र डालें, अनुसार [आईएएनए के 'एप्लिकेशन/जेसन' मीडिया टाइप पंजीकरण] (http://www.iana.org/assignments/media-types/application/json) में, एक समर्थित 'वर्णसेट' पैरामीटर बिल्कुल दिखाई नहीं देता है, यद्यपि अभ्यास में अक्सर आपूर्ति की जा रही है। – Uux

उत्तर

201

शीर्षलेख केवल यह दर्शाता है कि सामग्री को किस प्रकार एन्कोड किया गया है। सामग्री से सामग्री के प्रकार को कम करना आवश्यक नहीं है, यानी आप सामग्री को केवल जरूरी नहीं समझ सकते हैं और जानते हैं कि इसके साथ क्या करना है । यही है कि HTTP शीर्षलेख हैं, वे प्राप्तकर्ता को बताते हैं कि वे किस तरह की सामग्री (माना जाता है) से निपट रहे हैं।

Content-type: application/json; charset=utf-8 सामग्री को जेएसओएन प्रारूप में निर्दिष्ट करने के लिए निर्दिष्ट करता है, जो यूटीएफ -8 वर्ण एन्कोडिंग में एन्कोड किया गया है। जेएसओएन के लिए एन्कोडिंग को डिज़ाइन करना कुछ हद तक अनावश्यक है, क्योंकि जेएसओएन के लिए डिफ़ॉल्ट (केवल?) एन्कोडिंग यूटीएफ -8 है। तो इस मामले में प्राप्तकर्ता सर्वर यह जानकर खुश है कि यह JSON से निपट रहा है और मानता है कि एन्कोडिंग डिफ़ॉल्ट रूप से यूटीएफ -8 है, यही कारण है कि यह शीर्षलेख के साथ या उसके बिना काम करता है।

क्या यह एन्कोडिंग उन संदेशों को सीमित करती है जो संदेश निकाय में हो सकती हैं?

नहीं। आप हेडर और शरीर में जो कुछ भी चाहते हैं उसे भेज सकते हैं। लेकिन, यदि दोनों मेल नहीं खाते हैं, तो आपको गलत परिणाम मिल सकते हैं। यदि आप हेडर में निर्दिष्ट करते हैं कि सामग्री यूटीएफ -8 एन्कोडेड है लेकिन आप वास्तव में लैटिन 1 एन्कोडेड सामग्री भेज रहे हैं, तो रिसीवर लैटिन 1 एन्कोडेड डेटा को यूटीएफ -8 के रूप में समझने की कोशिश कर कचरा डेटा का उत्पादन कर सकता है। यदि आप निश्चित रूप से निर्दिष्ट करते हैं कि आप लैटिन 1 एन्कोडेड डेटा भेज रहे हैं और आप वास्तव में ऐसा कर रहे हैं, तो हाँ, आप 256 अक्षरों तक सीमित हैं जिन्हें आप लैटिन 1 में एन्कोड कर सकते हैं।

+3

बेशक, जेएसओएन में आप अभी भी '\ u20AC' जैसे बचने वाले अनुक्रमों का उपयोग करके गैर-लैटिन 1 वर्णों का प्रतिनिधित्व कर सकते हैं। – dan04

+22

जेसन के मानक के अनुसार, आपको वास्तव में सामग्री के एन्कोडिंग के लिए लैटिन 1 का उपयोग करने की अनुमति नहीं है। जेएसओएन सामग्री को यूनिकोड के रूप में एन्कोड किया जाना चाहिए, चाहे वह यूटीएफ -8, यूटीएफ -16, या यूटीएफ -32 (बड़ा या छोटा एंडियन) हो। –

+13

एप्लिकेशन/जेसन पर कोई वर्णमाला पैरामीटर नहीं है। –

124

@ deceze के दावे कि डिफ़ॉल्ट JSON एन्कोडिंग UTF-8 है ...

को पुष्ट करने के लिए IETF RFC4627 से:

JSON टेक्स्ट यूनिकोड में एन्कोड किया जाएगा। डिफ़ॉल्ट एन्कोडिंग यूटीएफ -8 है।

एक JSON पाठ के पहले दो अक्षर के बाद से हमेशा ASCII वर्ण [RFC0020] हो जाएगा, यह निर्धारित करने के लिए एक ओकटेट धारा UTF-8, UTF-16 (बीई या ले), या UTF- है कि क्या संभव है पहले चार ऑक्टेट्स में नल के पैटर्न पर देखकर 32 (बीई या ली)।

 00 00 00 xx UTF-32BE 
     00 xx 00 xx UTF-16BE 
     xx 00 00 00 UTF-32LE 
     xx 00 xx 00 UTF-16LE 
     xx xx xx xx UTF-8 
+8

यह हमेशा इसके बारे में सोचने में मदद करता है जेएसओएन बाइनरी प्रारूप के रूप में, पाठ प्रारूप नहीं। – Sulthan

+0

अब आरएफसी 4627 आरएफसी 7159 द्वारा अप्रचलित कर दिया गया है, जिसमें कहा गया है कि रूट मान एक स्ट्रिंग हो सकता है (पूर्व स्पेक के विपरीत स्पष्ट रूप से), यह अब कैसे लागू किया गया है? इस संबंध में यह कल्पना अस्पष्ट है, और सिर्फ यह कहती है कि तीन एन्कोडिंग की अनुमति है, लेकिन यह नहीं कि उन्हें कैसे अंतर किया जाए। –

+3

@FabioBeltramini उपर्युक्त अभी भी पकड़ना चाहिए, क्योंकि JSON में एक स्ट्रिंग में कोई शाब्दिक शून्य वर्ण नहीं होंगे (JSON में नल को संख्यात्मक भागने अनुक्रम यानी "\ u0000" ') के साथ एन्कोड किया जाना चाहिए। – thomasrutter

14

ध्यान दें कि IETF RFC4627IETF RFC7158 ने ले लिया है। खंड में [8.1] यह पाठ पहले @Drew द्वारा उद्धृत कह कर पलटा:

Implementations MUST NOT add a byte order mark to the beginning of a JSON text. 
+0

धारणा अभी भी रखती है, क्योंकि किसी वैध जेसन अभी भी दो एसीआईआई अक्षरों से शुरू होगा। – Larsing

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