आख़िर ये बराबर (=) के निशान क्या हैं?
(lars.ingebrigtsen.no)- हाल में Twitter पर पुराने email उद्धरण फैलने के साथ यह सवाल उठा कि वाक्यों के अंत में बराबर (=) का निशान क्यों दिखाई देता है
- यह निशान ‘quoted-printable’ encoding प्रक्रिया से आता है, और लंबी पंक्तियों को ज़बरदस्ती तोड़ते समय यह दिखाने के लिए इस्तेमाल होता है कि पंक्ति आगे जारी है
- email ट्रांसमिशन के दौरान CRLF(carriage return + line feed) को line break के रूप में इस्तेमाल किया जाता है, लेकिन इसे Unix के NL में बदलते समय अगर decoding algorithm गलत काम करे तो बराबर का निशान बचा रह सकता है या अक्षर खो सकते हैं
- बराबर का निशान line break के अलावा non-ASCII characters (जैसे: =C2=A0) को दिखाने के लिए भी इस्तेमाल होता है, और गलत decoder इसे साधारण replacement की तरह संभालकर त्रुटि पैदा करता है
- समस्या की जड़ bug वाले decoding logic और अनुचित conversion handling में है, जो दिखाती है कि email को प्रोसेस करने वाला व्यक्ति तकनीकी रूप से अपर्याप्त था
email उद्धरणों में बराबर (=) के निशान की असलियत
-
पिछले कुछ दिनों में Twitter पर पुराने email उद्धरण बड़ी संख्या में साझा किए गए, जिनमें वाक्यों के अंत में बराबर का निशान दिखना खास तौर पर नज़र आया
- लेखक ने इसे code या OCR(ऑप्टिकल कैरेक्टर रिकग्निशन) त्रुटि समझने वाले दावों का खंडन किया
- वास्तव में यह email को पढ़ने लायक फ़ॉर्म में बदलने की प्रक्रिया में हुई encoding handling error है
-
email पहले साधारण text हुआ करता था, लेकिन लंबी पंक्तियों और विशेष अक्षरों को संभालने के लिए ‘quoted-printable’ encoding लाई गई
- लंबी पंक्तियाँ तोड़ते समय पंक्ति के अंत में बराबर (=) जोड़कर यह बताया जाता है कि “यह पंक्ति आगे जारी है”
- इस समय बराबर के निशान के बाद CRLF(carriage return + line feed) आता है
line break encoding और decoding त्रुटि
-
email server मानक के तौर पर CRLF line break का उपयोग करते हैं, जबकि Unix सिस्टम केवल NL का उपयोग करते हैं
- conversion के दौरान एक byte कम हो जाता है, और decoder अगर इसे गलत तरीके से संभाले तो बराबर का निशान रह जाता है या अक्षर गायब हो जाते हैं
- उदाहरण के लिए, “non- =CRLF cloven” को गलत तरीके से प्रोसेस किया जाए तो वह “non- loven” बन सकता है, जहाँ ‘c’ गायब हो जाता है
-
कुछ implementations पंक्ति के अंत में बराबर का निशान मिलने पर दो characters हटाने के तरीके से काम करती हैं
- Unix फ़ॉर्मैट फ़ाइलों में यही algorithm गड़बड़ कर जाता है और बराबर का निशान जस का तस रह जाता है
बराबर के निशान का एक और उपयोग: non-ASCII character encoding
-
बराबर का निशान line break के अलावा non-ASCII character encoding में भी इस्तेमाल होता है
- उदाहरण: “=C2=A0” का मतलब non-breaking space(लाइन ब्रेक रोकने वाला स्पेस) है
- यह email body में indentation या special characters दिखाने के लिए अक्सर आता है
-
लेखक का अनुमान है कि कुछ converters ने =C2, =A0 जैसी चीज़ों को केवल search-replace से संभाला, सही decoder का उपयोग नहीं किया
तकनीकी पृष्ठभूमि और मानक
-
RFC 2045 मानक quoted-printable encoding को transport के लिए परिभाषित करता है
- प्राप्ति के बाद इसे decode करके साफ़ text के रूप में सहेजना ही सिद्धांत है
- लेकिन वास्तविक implementations में यह प्रक्रिया छोड़ दी जाती है, जिससे line break handling errors बार-बार होती हैं
-
उदाहरण code में
(quoted-printable-decode-string "he=\nllo")सही तरह से"hello"में बहाल हो जाता है- ऐसा इसलिए है क्योंकि algorithm को SMTP server संदर्भ में CRLF मानकर दोबारा इस्तेमाल किया गया
- Windows आधारित फ़ाइलों में यह सही काम करता है, लेकिन Unix आधारित सिस्टमों में असफल हो जाता है
निष्कर्ष
- email उद्धरणों में दिखने वाला बराबर का निशान quoted-printable encoding का अवशेष है, और
line break handling तथा non-ASCII character decoding की खामियों के संयुक्त परिणाम के रूप में उभरता है - समस्या का मूल कारण गलत decoder implementation और encoding conversion की त्रुटियाँ हैं
- लेखक इसे “तकनीकी समस्या और गलत processing का परिणाम” कहकर संक्षेपित करता है,
और email conversion प्रक्रिया में मानकों के सूक्ष्म पालन की आवश्यकता पर ज़ोर देता है
1 टिप्पणियां
Hacker News की राय
इस लेख के मुख्य व्यक्ति Lars Ingebrigtsen हैं, जिन्होंने Emacs के email/Usenet reader package Gnus का manual लिखा था
उनका manual चतुर, उपयोगी है, और उन्हें email parsing की अधिकांश लोगों से कहीं गहरी समझ है
manual को यहाँ देखा जा सकता है, और एक दूसरा संस्करण इस लिंक पर है
मुझे Oslo University (UiO) में वह समय याद है जब वे पहली बार Gnus बना रहे थे
हमारे informatics विभाग के छात्रों के बीच वे एक छोटे star developer थे, और सब Emacs और Gnus इस्तेमाल करते थे
यह घटना “खतरनाक हद तक जानने वाले व्यक्ति” का एक क्लासिक उदाहरण है
यह तो पता था कि email साधारण text नहीं है, लेकिन यह नहीं पता था कि quoted-printable decoding को साधारण replacement की तरह handle नहीं किया जा सकता
यह उसी तरह की bug है जैसे regex से HTML को सीधे parse करना; शुरू में सब ठीक लगता है, फिर बाद में कांग्रेस के सबूतों में ‘=’ चिन्हों की भरमार वाली स्थिति बन जाती है
एक सवाल था, “mail server लंबी lines से नफरत क्यों करते हैं?”
server को headers parse करने होते हैं, इसलिए इसे एक साधारण binary blob की तरह नहीं संभाला जा सकता
IMAP में server को पूरी parsing करनी पड़ती है, और POP3 एक single-device दुनिया के लिए बना था, इसलिए आज के समय में वह उपयुक्त नहीं है
RFC 821 ने line length को अधिकतम 1000 bytes तक सीमित किया था, और compatibility के लिए 80 characters से कम पर line break करना आम बात थी
इसलिए Base64 encoding भी हर 76 characters पर line break डालती है
उदाहरण के लिए PDP-11 में लगभग 512KB, VAX-11 में लगभग 2MB memory होती थी, और programmers byte level पर memory गिनते थे
HELO,MAIL FROM,RCPT TO,DATAआदि से communication की संरचना समझाई गईसंबंधित दस्तावेज़ IBM official docs और Wikipedia पर देखे जा सकते हैं
शुरुआत में लगा था कि यह लेख
= == === .=. <== ==> <<== ==>> (==) => =~=जैसे operator meanings के बारे में होगामैंने व्यक्तिगत रूप से email archiving software खुद बनाया है
20 साल से ज़्यादा समय से जमा हुई .eml files के edge case handling सबसे कठिन थे
concept सरल है, लेकिन email हैरान कर देने लायक जटिल है
email address validation भी व्यवहार में लगभग असंभव है
कुछ सालों तक उसके थोड़े-बहुत users रहे, लेकिन MIME handling सबसे बड़ा दर्द था
मुझे ‘=’ चिन्ह से ज़्यादा दिलचस्प यह लगा कि उसके आसपास के characters गायब हो रहे थे
यह किसी off-by-one error जैसा लगा; मानो ‘=’ हटाने के बजाय असली text का कुछ हिस्सा ही गायब हो गया हो
शायद CRLF/LF conversion का इससे संबंध हो सकता है
यह समस्या अभी क्यों दिख रही है, इस पर जिज्ञासा थी
पिछले कुछ दिनों से लोग पुराने emails को Twitter पर डाल रहे हैं; सवाल था कि ऐसा क्यों हो रहा है
कुछ लोगों ने कहा कि इस समस्या की वजह Gmail नहीं, बल्कि बीच के server पर हुआ conversion हो सकता है
CRLF→LF conversion के अलावा, अगर quoted-printable को दो बार apply किया जाए तो ‘=’ बचे रह सकते हैं, इसलिए संभव है कि इसमें दो mail servers शामिल रहे हों
असल में कोई गैर-पेशेवर intern साधारण tools से data इकट्ठा करता है, वह कई बार convert होता है, और format टूट-फूट जाता है
original पहले ही नष्ट हो चुका होता है, और अंत में सिर्फ आकार भर बचा हुआ टुकड़ा data रह जाता है
archive.today के लेख में भी यही quoted-printable corruption दिखाई देता है
संबंधित links हैं pastes.io/correspond और HN thread
कहा गया कि Outlook से downloaded mail देखते समय ऐसा .eml viewer होना अच्छा होगा जो quoted-printable को अपने-आप decode कर दे