HTTP हेडर के लिए मुझे किस वर्ण एन्कोडिंग का उपयोग करना चाहिए?


122

मैं एक HTTP "हैडर " के लिए "मजेदार" HTML विशेष-वर्ण (APK) ( अधिक जानकारी के लिए http://html5boilerplate.com/ देखें) का उपयोग कर रहा हूं Serverऔर सोच रहा हूं कि क्या यह प्रति युक्ति "अनुमति" है।

  • Chrome में Windows Xp प्रो SP 3 में dev टूल में नेटवर्क टैब का उपयोग करना, मुझे बस ठीक दिखाई दे रहा है।

  • IE8 में APK को सही ढंग से प्रस्तुत नहीं किया गया है।

  • W3.org HTML सत्यापनकर्ता इसे सही तरीके से प्रस्तुत नहीं करता है ( â°इसके बजाय " " प्रदर्शित करता है )।

अब, मैं चरित्र एनकोडिंग के लिए बहुत उत्सुक नहीं हूँ ... और सच कहूँ तो मैं वास्तव में उनके बारे में बहुत ज्यादा परवाह नहीं करता हूं; मैं बस आँख बंद करके UTF-8 cus का उपयोग करता हूँ जो मुझे बताया गया है। :-)


क्या अलग-अलग पार्सरों / ब्रॉज / इंजन / (जो भी-वे-कहा जाता है) में कीड़े के कारण असमानता है?

क्या इसके लिए एक युक्ति है या शायद एक HTTP- हेडर "मान" के लिए अनुमत पात्रों की सूची है?


29
यह सवाल आम तौर पर पूछे जाने वाले बेहतर होगा: "http हैडर वैल्यू में कौन से वर्णों की अनुमति है"
Akrikos


2
"अब, मैं चरित्र एनकोडिंग के लिए बहुत उत्सुक नहीं हूं ... और स्पष्ट रूप से मैं वास्तव में उनके बारे में बहुत अधिक परवाह नहीं करता हूं; मैं बस आँख बंद करके यूटीएफ -8 का उपयोग करता हूं जो मुझे बताया गया है। :-)" <--- - joelonsoftware.com/2003/10/08/… के लिए अप्रचलित
d4nyll

जवाबों:


124

संक्षेप में: केवल एएससीआईआई को काम करने की गारंटी है। कुछ गैर-एएससीआईआई बाइट्स को पीछे की संगतता के लिए अनुमति दी जाती है, लेकिन इसे प्रदर्शित करने योग्य नहीं माना जाता है।

HTTPbis ने छोड़ दिया और निर्दिष्ट किया कि हेडर में ASCII के अलावा कोई उपयोगी एन्कोडिंग नहीं है:

ऐतिहासिक रूप से, HTTP ने ISO-8859-1 charset [ISO-8859-1] में पाठ के साथ फ़ील्ड सामग्री की अनुमति दी है, [RFC2047] एन्कोडिंग के उपयोग के माध्यम से अन्य वर्णों का समर्थन करते हैं। व्यवहार में, अधिकांश HTTP शीर्ष लेख फ़ील्ड मान केवल US-ASCII चारसेट [USASCII] के सबसेट का उपयोग करते हैं। नए परिभाषित हेडर फ़ील्ड SHOULD अपने फ़ील्ड मानों को US-ASCII ऑक्टेट तक सीमित करते हैं। एक प्राप्तकर्ता SHOULD अपारदर्शी डेटा के रूप में अन्य ऑक्टेट्स को फ़ील्ड सामग्री (ऑब्ज़र्व-टेक्स्ट) में मानता है।


पहले, 1999 से RFC 2616 ने इसे परिभाषित किया:

* TEXT MAY के शब्दों में RFC 2047 [14] के नियमों के अनुसार एन्कोड किए जाने पर ही ISO- 8859-1 [22] के अलावा अन्य कैरेक्टर सेट के कैरेक्टर होते हैं।

और RFC 2047 MIME एन्कोडिंग है , इसलिए यह होगा:

=?UTF-8?Q?=E2=9C=B0?=

लेकिन मुझे नहीं लगता कि कई (यदि कोई हो) ग्राहक इसका समर्थन करते हैं।


7
तो इसका मतलब क्या है? क्या "APK" वैध / अनुमत है?
डेविड मर्डोक

8
बहुत उपयोगी उत्तर पर थोड़ा विस्तार करने के लिए: "UTF-8" वर्ण सेट है, और "Q" का अर्थ है कि मूल्य "उद्धृत-मुद्रण योग्य" होगा। यदि आप BASE64-मान को एनकोड करना चाहते हैं तो "B" का भी उपयोग किया जा सकता है।
गर्गानुचेट

1
@ चोंचले, तो "अपारदर्शी डेटा" का क्या अर्थ है? जब यह "अपारदर्शी डेटा" प्राप्त करता है तो HTTP प्राप्तकर्ता को वास्तव में क्या करना चाहिए ?
पचेरियर

1
@ स्पेसर "अपारदर्शी डेटा" का अर्थ है कि यह बाइट्स के एक समूह के साथ एक ब्लैक बॉक्स है जिसे एप्लिकेशन प्रदर्शित करने या व्याख्या करने की कोशिश नहीं करनी चाहिए (जैसे बाइनरी डेटा)। इसके साथ जो होता है वह हेडर पर निर्भर करता है, "नथिंग" से लेकर "डिसकस" तक हो सकता है।
कोर्नेल

@ कोर्नेल, Btw आपने अपने उपयोगकर्ता नाम को कोर्नेल में क्यों बदला?
पचेरियर

10

कृपया टिप्पणियों को पहले पढ़ें, यह उत्तर संभावना सही स्रोतों से गलत निष्कर्ष निकालती है, संपादित करने की आवश्यकता है।


आप किसी भी मुद्रण योग्य ASCII वर्णों का उपयोग कर सकते हैं, और कोई विशेष वर्ण जैसे कि APK (जो ASCII नहीं है )

युक्ति : आप JSON में कुछ भी एनकोड कर सकते हैं।

संपादित करें : पहली बार में स्पष्ट नहीं हो सकता है, हेडर में परिभाषित वर्ण एन्कोडिंग केवल प्रतिक्रिया निकाय के लिए लागू होती है, हेडर के लिए ही नहीं। (जैसा कि यह एक चिकन - और - अंडे की समस्या का कारण होगा।)


मैं Penchant द्वारा जुड़ी कल्पना के अनुसार सभी प्रासंगिक परिभाषाएँ जोड़ना चाहता हूँ।

message-header = field-name ":" [ field-value ]
field-name     = token
field-value    = *( field-content | LWS )

इसलिए, हम क्षेत्र-मूल्य के बाद हैं ।

LWS            = [CRLF] 1*( SP | HT )
CRLF           = CR LF
CR             = <US-ASCII CR, carriage return (13)>
LF             = <US-ASCII LF, linefeed (10)>
SP             = <US-ASCII SP, space (32)>
HT             = <US-ASCII HT, horizontal-tab (9)>

LWS का अर्थ है रैखिक व्हाइट स्पेस। अनिवार्य रूप से, LWS स्पेस या टैब है, लेकिन आप स्पेस या टैब से पहले एक नई लाइन शुरू करके अपने फील्ड-वैल्यू को कई लाइनों में तोड़ सकते हैं।

आइये इसे सरल करते हैं:

field-value    = <any field-content or Space or Tab>

अब हम फील्ड-कंटेंट के बाद हैं ।

field-content  = <the OCTETs making up the field-value
                 and consisting of either *TEXT or combinations
                 of token, separators, and quoted-string>
OCTET          = <any 8-bit sequence of data>
TEXT           = <any OCTET except CTLs,
                 but including LWS>
CTL            = <any US-ASCII control character
                 (octets 0 - 31) and DEL (127)>
token          = 1*<any CHAR except CTLs or separators>
separators     = "(" | ")" | "<" | ">" | "@"
                 | "," | ";" | ":" | "\" | <">
                 | "/" | "[" | "]" | "?" | "="
                 | "{" | "}" | SP | HT

TEXT सबसे सामान्य है और इसमें बाकी के सभी शामिल हैं, बाकी के बारे में भूल जाते हैं- यहाँ US-ASCII चारसेट (= ASCII) है

जैसा कि आप देख सकते हैं, सभी मुद्रण योग्य ASCII वर्णों की अनुमति है।


3
आप आपके द्वारा उद्धृत अंशों का खंडन कर रहे हैं । आप क्यों कहते हैं "और कोई विशेष वर्ण जैसे कि एपीके"? विशेष वर्ण बस कर रहे हैं OCTETहै, और के बाद से TEXTकिसी भी है OCTETको छोड़कर 0 - 31सभी कि, इस का मतलब है OCTETसे रों 32को 255 अनुमति दी जाती है । APK के ऑक्टेट हैं 226, 156और 176उनमें से तीनों की अनुमति है, इसलिए आपके द्वारा उद्धृत अंशों के अनुसार APK की अनुमति है।
पचेरियर

2
@Pacerier आपको पूरी तरह से सही लगता है, मैं यह नहीं देखता कि मैंने जो निष्कर्ष निकाला था, उसे मैंने क्यों आकर्षित किया।
zupa

@Pacerier अभी तक मैं इसे संपादित करने के लिए तैयार नहीं हूं क्योंकि मुझे फिर से कल्पना की जांच करने की आवश्यकता थी। मुझे डर है कि अतिरिक्त विवरण यूएस-एएससीआईआई चारसेट तक सीमित हैं जो बदले में निष्कर्ष का समर्थन करेंगे, फिर भी तर्क अपर्याप्त है।
zupa

1
"आप JSON में कुछ भी सांकेतिक शब्दों में बदलना कर सकते हैं" कहना थोड़ा भ्रामक है। JSON यूनिकोड वर्णों के लिए अनुमति देता है, जबकि, HTTP हेडर US-ASCII होना चाहिए। यूनिकोड वर्णों को "अपारदर्शी" डेटा के रूप में माना जाएगा और इस प्रकार व्यवहार HTTP विनिर्देश द्वारा अपरिभाषित है। कहा जा रहा है कि, JSON को एक HTTP हेडर में शामिल करने के लिए यूनिकोड वर्णों से बचकर सुरक्षित किया जा सकता है।
याकूब

@ ज़ुपा, एक और मुद्दा है ... " सिवायCTLs " का मतलब क्या है? यह वर्ण मतलब यह है CR, LFकी अनुमति है? या इसका मतलब केवल निरंतर अनुक्रम " CR LF SP/ HT" की अनुमति है? (दूसरे शब्दों में, शीर्ष लेख कर सकते हैं मानों एक भी होते हैं CRया LFया HTकर सकते हैडर मान वर्ण हो? CR, LFहै, और HTकिसी भी क्रम और राशि में?)
Pacerier
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.