JSON Toolkit

BOM কি JSON পার্সিং ভাঙে

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

শিক্ষানবিশ~4 মিনিট পড়াপ্রকাশ 2026-10-30আপডেট 2026-10-30
BOM কীভাবে JSON পার্সিং ভাঙে ও কীভাবে সরাবেন

মূল কথা: প্রথম তিন বাইটে 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' — যা পরে এটি নির্ণয়ের চেয়ে অনেক সস্তা।

আরও পড়ুন