क्या BOM JSON पार्सिंग तोड़ता है
मुख्य बात: UTF-8 BOM तीन अदृश्य बाइट्स हैं, इसलिए JSON.parse पहले ही अक्षर पर विफल होता है और लाइन 1 कॉलम 1 बताता है, जिससे फ़ाइल खाली या कटी-फटी लगती है।

मुख्य बात: पहले तीन बाइट्स में EF BB BF जाँचें और BOM के बिना UTF-8 में फिर से सहेजें; सर्वर पर, किसी अपलोड या थर्ड-पार्टी फ़ाइल को पार्स करने से पहले शुरुआती U+FEFF हटाएँ, बाद में विफलता डीबग करने के बजाय।
हाँ — और यह सबसे भ्रमित करने वाली parse एरर पैदा करता है, क्योंकि फ़ाइल पूरी तरह ठीक दिखती है।
आपको क्या दिखता है
SyntaxError: Unexpected token in JSON at position 0
Unexpected character '\uFEFF'
संदेश में वह अक्षर अदृश्य है। Position 0 का अर्थ है ठीक पहला बाइट।
cat कुछ असामान्य नहीं दिखाता। hexdump -C file.json | head -1 दिखाता है:
00000000 ef bb bf 7b 0a 20 20 22 61 22 3a 20 31 0a 7d 0a |...{ "a": 1.}.|
7b यानी {। इससे पहले के तीन बाइट्स BOM हैं।
BOM कहाँ से आता है
Byte order mark UTF-16 के लिए अस्तित्व में आया, जहाँ byte order वाकई बदलता था। UTF-8 का byte order एक ही है, इसलिए BOM शुद्ध ओवरहेड है — फिर भी Windows का Notepad, कुछ Excel exports, और कुछ पुराने IDEs अब भी इसे डिफ़ॉल्ट रूप से लिखते हैं।
RFC 8259 स्पष्ट है: सिस्टम के बीच आदान-प्रदान होने वाली JSON UTF-8 होनी चाहिए, और कार्यान्वयन BOM नहीं जोड़ सकते। पार्सर शुरुआती BOM को अनदेखा कर सकते हैं लेकिन करने के लिए बाध्य नहीं। ब्राउज़र और Node इसे न छोड़ना चुनते हैं।
इसे हटाने के तीन तरीके
BOM के बिना सहेजें। VS Code में, स्टेटस बार में एन्कोडिंग पर क्लिक करें और "Save with Encoding → UTF-8" चुनें, "UTF-8 with BOM" नहीं।
शेल से हटाएँ।
sed -i '1s/^\xEF\xBB\xBF//' data.json
पढ़ते समय हटाएँ। अपलोड या थर्ड-पार्टी फ़ाइलें स्वीकार करने वाली हर चीज़ के लिए यह टिकाऊ समाधान है:
const text = require('node:fs').readFileSync('data.json', 'utf8').replace(/^\uFEFF/, '');
JSON.parse(text);
Python में, open(path, encoding='utf-8-sig') इसे अपने आप संभाल लेता है।
दो मिलते-जुलते problems
- Zero-width space (U+200B) — वेब पेज से JSON कॉपी करते समय आ जाता है; लक्षण एक जैसा, कोडपॉइंट अलग।
- Full-width quotes — चीनी IME
"key"को“key”बना देता है, जो लगभग एक जैसा दिखता है लेकिनUnexpected token “के रूप में विफल होता है।
तीनों अदृश्य-अक्षर bugs हैं। निदान हमेशा एक ही है: टेक्स्ट को घूरने के बजाय पहले बाइट्स को hex में डंप करें।
FAQ
मैं कैसे पता करूँ कि फ़ाइल BOM से शुरू होती है?
cat कुछ नहीं दिखाता, इसलिए hexdump -C file.json | head -1 चलाएँ। अगर आउटपुट ef bb bf से शुरू होता है, तो फ़ाइल में BOM है; साफ़ UTF-8 फ़ाइल में पहले 7b (यानी {) आना चाहिए।
एरर हमेशा लाइन 1, कॉलम 1 पर क्यों इशारा करती है?
BOM बाकी सब से पहले होता है, इसलिए पार्सर जो पहला अक्षर पढ़ता है वह U+FEFF है। इसलिए विफलता फ़ाइल के शुरू में होती है, जिससे फ़ाइल खाली लगती है।
क्या पार्सिंग से पहले BOM हटाना चाहिए?
हाँ। जब सर्वर कॉन्फ़िग पढ़ता है या अपलोड की गई फ़ाइलें पार्स करता है, तो पहले शुरुआती U+FEFF हटाएँ — Node में replace(/^\uFEFF/, ''), Python में encoding='utf-8-sig' — जो बाद में निदान करने से बहुत सस्ता है।