BOM কি JSON পার্সিং ভাঙে
সংক্ষেপে: UTF-8 BOM তিনটি অদৃশ্য বাইট, তাই `JSON.parse` প্রথম অক্ষরেই ব্যর্থ হয় আর লাইন ১ কলাম ১ রিপোর্ট করে, ফলে ফাইল খালি বা কাটা মনে হয়।

মূল কথা: প্রথম তিন বাইটে EF BB BF আছে কি না দেখে BOM ছাড়া UTF-8 হিসেবে আবার সংরক্ষণ করুন; সার্ভারে আপলোড বা তৃতীয়-পক্ষ ফাইল পার্স করার আগেই শুরুতে U+FEFF সরান, পরে ব্যর্থতা ডিবাগ না করে।
হ্যাঁ — আর এটি সবচেয়ে বিভ্রান্তিকর পার্স এরর তৈরি করে, কারণ ফাইল দেখতে সম্পূর্ণ ঠিক।
যা দেখেন
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-এর জন্য ছিল, যেখানে বাইট ক্রম সত্যিই বদলাত। UTF-8-এ একটাই বাইট ক্রম, তাই BOM নিছক বাড়তি — তবু Windows Notepad, কিছু Excel এক্সপোর্ট ও কয়েকটি পুরোনো IDE ডিফল্টে লিখে।
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') স্বয়ংক্রিয়ভাবে সামলায়।
দেখতে একই রকম দুই সমস্যা
- zero-width space (U+200B) — ওয়েব পেজ থেকে JSON কপি করার সময় ধরা পড়ে; একই লক্ষণ, ভিন্ন কোডপয়েন্ট।
- ফুল-উইডথ কোট — চীনা IME
"key"-কে“key”করে, যা প্রায় অভিন্ন দেখায় কিন্তুUnexpected token “হয়ে ব্যর্থ।
তিনটিই অদৃশ্য-অক্ষরের বাগ। নির্ণয় সবসময় একই: টেক্সটের দিকে তাকিয়ে না থেকে Hex-এ প্রথম বাইট ডাম্প করুন।
সাধারণ প্রশ্ন
ফাইল BOM দিয়ে শুরু কি না কীভাবে বুঝব?
cat কিছু দেখায় না, তাই hexdump -C file.json | head -1 চালান। আউটপুট ef bb bf দিয়ে শুরু হলে ফাইলে BOM আছে; পরিচ্ছন্ন UTF-8 ফাইলে 7b ({) আগে আসা উচিত।
এরর সবসময় লাইন ১, কলাম ১ দেখায় কেন?
BOM সব কিছুর আগে বসে, তাই পার্সারের পড়া প্রথম অক্ষর U+FEFF। ব্যর্থতা ফাইলের শুরুতে পড়ে, ফলে ফাইল খালি মনে হয়।
পার্সের আগে BOM সরানো উচিত?
হ্যাঁ। সার্ভার কনফিগ পড়লে বা আপলোড করা ফাইল পার্স করলে আগে শুরুতে থাকা U+FEFF সরান — Node-এ replace(/^\uFEFF/, ''), Python-এ encoding='utf-8-sig' — যা পরে এটি নির্ণয়ের চেয়ে অনেক সস্তা।