घुमावदार उद्धरण आपका code, JSON और CSV क्यों तोड़ते हैं

एरर उस लाइन की ओर इशारा करता है जो देखने में बिल्कुल ठीक लगती है, क्योंकि फ़र्क एक नज़र में अदृश्य होता है।

घुमावदार उद्धरण (“ ” ‘ ’) सीधे उद्धरण (" ') से अलग Unicode अक्षर हैं, जबकि प्रोग्रामिंग भाषाओं और डेटा फ़ॉर्मैट को सीधे उद्धरण चाहिए। पार्सर ठीक-ठीक code point मिलाते हैं, इसलिए घुमावदार उद्धरण उनके लिए बस एक साधारण अक्षर है और स्ट्रिंग कभी खुलती ही नहीं। उन्हें सीधे उद्धरण से बदलते ही समस्या तुरंत ठीक हो जाती है।

ये सचमुच अलग अक्षर हैं

पूरी समस्या इस एक टेबल में समाहित है:

अक्षर नाम Code point
" सीधा दोहरा उद्धरण U+0022
बायाँ दोहरा उद्धरण चिह्न U+201C
दायाँ दोहरा उद्धरण चिह्न U+201D
' सीधा अपॉस्ट्रॉफ़ी U+0027
बायाँ एकल उद्धरण चिह्न U+2018
दायाँ एकल उद्धरण चिह्न U+2019

प्रोग्रामिंग भाषाएँ, JSON, CSV और शेल इंटरप्रेटर इनमें से सिर्फ़ दो को स्ट्रिंग डिलिमिटर मानते हैं: U+0022 और U+0027। बाकी चार साधारण छपने वाले अक्षर हैं — किसी अक्षर या कॉमा की ही श्रेणी में।

इसलिए जब पार्सर “name” से टकराता है, तो वह थोड़े सजीले उद्धरणों वाली स्ट्रिंग नहीं देखता। वह ऐसे अक्षरों का क्रम देखता है जो बिना उद्धरण के शुरू हो रहा है और जिसकी शुरुआत किसी अनपेक्षित चिह्न से हुई है। एरर मैसेज unexpected token जैसा कुछ कहता है और उस लाइन की ओर इशारा करता है जो दिखने में बिल्कुल सही लगती है, क्योंकि सामान्य फ़ॉन्ट साइज़ में " और “ का फ़र्क घुमाव के चंद पिक्सल का होता है।

चैट से पेस्ट किया{ name: Ada }SyntaxError: Unexpected token '“'साधारण बनाने के बाद{ "name": "Ada" }
घुमावदार उद्धरण चिह्न सीधे उद्धरणों से अलग अक्षर होते हैं, जिनकी पार्सर को उम्मीद होती है।

ये आते कहाँ से हैं

लगभग हमेशा किसी सॉफ़्टवेयर की मददगारी से।

  • Word और Google Docs टाइप करते समय सीधे उद्धरणों को घुमावदार में बदल देते हैं। यह डिफ़ॉल्ट रूप से चालू होता है और ज़्यादातर लोगों को कभी पता नहीं चलता, क्योंकि गद्य में यही चाहिए भी होता है।
  • चैट मॉडल इसलिए बनाते हैं क्योंकि उन्होंने प्रकाशित गद्य से सीखा है, जिसमें उचित टाइपोग्राफ़िक उद्धरण चिह्न इस्तेमाल होते हैं।
  • macOS कई टेक्स्ट फ़ील्ड में सिस्टम-वाइड स्मार्ट सब्स्टिट्यूशन लागू करता है।
  • CMS एडिटर और कमेंट बॉक्स अक्सर सबमिट किए गए टेक्स्ट पर टाइपोग्राफ़िक फ़िल्टर चलाते हैं।
  • PDF से कॉपी-पेस्ट में वही आता है जो टाइपसेटर ने इस्तेमाल किया, और किसी भी प्रोफ़ेशनल दस्तावेज़ में वह घुमावदार ही होता है।

इन सबमें एक ही बात कॉमन है: टेक्स्ट पढ़ने के लिए बनी किसी चीज़ से होकर पार्स करने के लिए बनी किसी चीज़ तक पहुँचा। गद्य को टाइपोग्राफ़िक उद्धरण चाहिए; code को सटीक बाइट चाहिए। मुसीबत इसी सीमा पर होती है।

यही बात कुछ साथी अक्षरों पर भी लागू होती है जिन्हें जानना ज़रूरी है: तीन बिंदुओं की जगह एलिप्सिस अक्षर (…), हाइफ़न की जगह en और em डैश, और साधारण स्पेस की जगह नॉन-ब्रेकिंग स्पेस। हर एक का code point उस ASCII अक्षर से अलग है जैसा वह दिखता है, और हर एक पार्सर को उसी खामोश तरीके से तोड़ता है।

क्या-क्या टूटता है, ठीक-ठीक

JSON. JSON में हर स्ट्रिंग के लिए U+0022 ज़रूरी है। एक भी घुमावदार उद्धरण पूरा दस्तावेज़ अमान्य कर देता है, और चूँकि पार्सर पहली नाकामी रिपोर्ट करते हैं, दर्जनों घुमावदार उद्धरण वाली फ़ाइल को हाथ से ठीक करने में कई दौर लगते हैं। JSON फ़ॉर्मैटर और वैलिडेटर में पेस्ट करने से पहले दोषी अक्षर की सटीक जगह दिख जाती है।

CSV. उद्धरण के नियम कॉमा वाले फ़ील्ड की सुरक्षा के लिए बने हैं। घुमावदार उद्धरण कोई उद्धरण अक्षर नहीं है, इसलिए “Smith, John” जैसा फ़ील्ड कॉमा पर बँट जाता है और आगे का हर कॉलम एक स्थान खिसक जाता है। यह सिंटैक्स एरर से भी खराब है, क्योंकि यह खामोशी से फ़ेल होता है — फ़ाइल बिना किसी शिकायत के इम्पोर्ट होती है और गलत होती है।

सोर्स code. ज़्यादातर भाषाओं में यह कम्पाइल या पार्स एरर है, जो कम से कम शोर तो मचाता है। शेल स्क्रिप्ट में यह और बुरा हो सकता है: हाइफ़न की जगह en डैश वाला rm –rf वह फ़्लैग नहीं है जो आप चाहते थे, और घुमावदार उद्धरणों वाले आर्गुमेंट शाब्दिक टेक्स्ट के रूप में आगे चले जाते हैं।

कॉन्फ़िगरेशन फ़ाइलें. YAML, TOML और .env फ़ाइलें घुमावदार उद्धरणों को वैल्यू के हिस्से के तौर पर खामोशी से स्वीकार कर लेती हैं। आपकी API key के साथ एक सजावटी अक्षर जुड़ जाता है, ऑथेंटिकेशन फ़ेल होता है, और लॉग में कहीं वजह नहीं लिखी होती।

रेगुलर एक्सप्रेशन और खोज. सीधे उद्धरण वाला पैटर्न घुमावदार उद्धरण वाले टेक्स्ट से मेल नहीं खाएगा, इसलिए find-and-replace चुपचाप शून्य नतीजे देता है।

इसे सही तरीके से कैसे ठीक करें

टेक्स्ट को सामान्य बनाएँ. उसे घुमावदार उद्धरण को सीधे उद्धरण में बदलें में पेस्ट करें, जो चारों घुमावदार रूपों को उनके ASCII समकक्षों से बदल देता है और बताता है कि कितने बदले गए। खासकर AI आउटपुट के लिए AI टेक्स्ट साफ़ करने वाला टूल उद्धरणों के साथ-साथ em डैश, अदृश्य अक्षर और इमोजी भी एक ही बार में संभालता है।

स्रोत ही बंद करें. अगर यह बार-बार होता है, तो सब्स्टिट्यूशन बंद करें:

  • Word: File → Options → Proofing → AutoCorrect Options → AutoFormat As You Type → "Straight quotes with smart quotes" को अनचेक करें।
  • Google Docs: Tools → Preferences → "Use smart quotes" को अनचेक करें।
  • macOS: System Settings → Keyboard → Text Input → Edit → smart quotes और dashes बंद करें।

Word प्रोसेसर में code न लिखें. असली समाधान संरचनात्मक है। जो कुछ भी पार्सर के लिए बन रहा है उसे प्लेन-टेक्स्ट एडिटर में लिखा जाना चाहिए, जो आपके अक्षरों को कभी नहीं बदलेगा।

ज़्यादा सुधार से सावधान रहें. गद्य में घुमावदार उद्धरणों को एकसाथ न बदलें। लेख या ईमेल में टाइपोग्राफ़िक उद्धरण सही होते हैं और सीधे उद्धरण खराब दिखते हैं। सिर्फ़ सीमा पर सामान्य बनाएँ — जब टेक्स्ट दस्तावेज़ से code या डेटा में जाता है — हर जगह डिफ़ॉल्ट रूप से नहीं।

अगर उद्धरण सामान्य करने के बाद भी फ़ाइल फ़ेल हो, तो अगला संदिग्ध कोई अदृश्य अक्षर है; अदृश्य Unicode रेफ़रेंस देखें।

अक्सर पूछे जाने वाले सवाल

मेरा JSON सही दिखते हुए भी unexpected token क्यों कहता है?

लगभग हमेशा वजह सीधे उद्धरण की जगह कोई घुमावदार उद्धरण होता है। JSON को ठीक U+0022 चाहिए, और घुमावदार रूप U+201C और U+201D पार्सर के लिए साधारण अक्षर हैं। स्क्रीन पर फ़र्क चंद पिक्सल का होता है, इसीलिए लाइन ठीक लगती है।

घुमावदार और सीधे उद्धरण में क्या फ़र्क है?

ये अलग-अलग Unicode अक्षर हैं। सीधे उद्धरण U+0022 और U+0027 हैं — वे ASCII अक्षर जिनकी उम्मीद हर पार्सर करता है। घुमावदार उद्धरण U+2018, U+2019, U+201C और U+201D हैं — टाइपोग्राफ़िक चिह्न जो टेक्स्ट की ओर मुड़ते हैं, गद्य में सही और स्ट्रिंग डिलिमिटर के तौर पर अमान्य।

घुमावदार उद्धरणों को सीधे उद्धरण में कैसे बदलूँ?

टेक्स्ट को किसी नॉर्मलाइज़र में पेस्ट करें, जैसे घुमावदार उद्धरण को सीधे उद्धरण में बदलने वाला टूल, जो चारों घुमावदार रूपों को बदलकर गिनती भी बताता है। find-and-replace से करने पर हर अक्षर के लिए अलग पास चाहिए — कुल चार — इसीलिए यह काम अक्सर अधूरा रह जाता है।

मेरे CSV इम्पोर्ट में कॉलम क्यों खिसक जाते हैं?

कॉमा वाला फ़ील्ड तभी सुरक्षित रहता है जब वह सीधे उद्धरणों में लिपटा हो। घुमावदार उद्धरण कोई उद्धरण अक्षर नहीं है, इसलिए फ़ील्ड कॉमा पर बँट जाता है और आगे का हर कॉलम खिसक जाता है। यह खामोशी से फ़ेल होता है — फ़ाइल साफ़ इम्पोर्ट होती है और गलत होती है।

क्या मुझे हमेशा घुमावदार उद्धरण हटाने चाहिए?

नहीं। गद्य में वे सही टाइपोग्राफ़ी हैं और सीधे उद्धरणों से बेहतर दिखते हैं। सिर्फ़ तब सामान्य बनाएँ जब टेक्स्ट code, JSON, CSV, कॉन्फ़िगरेशन फ़ाइल या किसी ऐसी चीज़ में जा रहा हो जिसे पढ़ा नहीं, पार्स किया जाएगा।

इस गाइड में बताए गए टूल

संबंधित गाइड