JSON-এ বাংলা লেখার ছয় ফাঁদ: অঙ্ক, ব্যাকস্ল্যাশ, উদ্ধৃতিচিহ্ন ও \u কোড

JSON-এ দামের ঘরে বাংলা অঙ্ক ১২ লিখলে ভুলের বার্তা আসে, ইংরেজি অঙ্ক 12 লিখলে JSON সঠিক বলে

কাল্পনিক দোকানদার ফারহানা পণ্যের তালিকা JSON-এ রাখতে চায়। নাম বাংলায়, দাম বাংলা কিবোর্ডে টাইপ করা, ছবির পথ কপি করা। প্রতিবারই JSON ফরম্যাটার টুলে ভুলের বার্তা আসে, অথচ লেখাটা তার চোখে ঠিকই দেখাচ্ছে। এই লেখায় বাংলা লেখা, অঙ্ক আর ব্যাকস্ল্যাশ ঘিরে ছয়টি ফাঁদ আছে, প্রতিটি টুলের পার্সারে চালিয়ে মেলানো। টুলের তিন বোতাম কী করে, তা আগের গাইডে; ভুলের বার্তার জায়গা কীভাবে পড়বেন, তা ভুল ধরার গাইডে।

বাংলা লেখা JSON-এ সরাসরি চলে

আগে ভালো খবর। কী-এর নাম ও মান, দুটিই বাংলায় লেখা যায়। {"নাম":"রাকিব","বয়স":28} টুলে বসিয়ে “সাজান” চাপলে ৪ লাইনের ফল আসে, আর বাংলা যেমন ছিল তেমন থাকে। কোনো বিশেষ কোড বা এনকোডিং বোতাম লাগে না। ফাঁদগুলো আসে বাংলা অঙ্ক, ব্যাকস্ল্যাশ আর উদ্ধৃতিচিহ্ন থেকে।

ফাঁদ ১: দামের ঘরে বাংলা অঙ্ক

JSON-এর সংখ্যা শুধু ০ থেকে ৯-এর ইংরেজি রূপে (0 থেকে 9) লেখা যায়। {"মূল্য": ১২} দিলে টুল বলে: Unexpected token '১', "{"মূল্য": ১২}" is not valid JSON। ব্রাউজার ১ চিহ্নটিকেই সংখ্যা বলে চেনে না।

উদ্ধৃতিচিহ্ন দিয়ে "মূল্য": "১২" লিখলে ভুল আসে না, কিন্তু তখন ওটি সংখ্যা নয়, একটি লেখা, আর কোনো প্রোগ্রাম সেটি দিয়ে যোগ বা তুলনা করতে পারবে না। তাই ডেটার সংখ্যা ইংরেজি অঙ্কে রাখাই সাধারণ রীতি; বাংলা অঙ্কে দেখানোর কাজ সাধারণত দেখানোর স্তরে হয়।

সমাধান: ডিজিট কনভার্টারে পুরো লেখা বসিয়ে “বাংলা থেকে ইংরেজি অঙ্ক” চাপুন। তবে একটি সতর্কতা আছে: কনভার্টার লেখার ভেতরের অঙ্কও বদলে দেয়। {"মূল্য": ১২, "ফোন": "০১৭১২৩৪৫৬৭৮", "ঠিকানা": "বাসা ১২, রোড ৩"} বদলে হয় {"মূল্য": 12, "ফোন": "01712345678", "ঠিকানা": "বাসা 12, রোড 3"}। JSON ঠিক থাকে, কিন্তু ঠিকানার বাংলা অঙ্ক ইংরেজি হয়ে যায়। ঠিকানা বা নামে বাংলা অঙ্ক রাখতে চাইলে শুধু সংখ্যার জায়গাটি হাতে বদলান।

ফাঁদ ২: ফাইলের পথে একটি ব্যাকস্ল্যাশ

JSON-এ ফাইলের পথ C:\Users\rakib লিখলে একটি ব্যাকস্ল্যাশে ভুলের বার্তা আসে; দুটি ব্যাকস্ল্যাশ লিখলে সঠিক; C:\new লিখলে কোনো বার্তা ছাড়াই \n নতুন লাইন হয়ে যায়
ফাইলের পথে একটি ব্যাকস্ল্যাশ ভুল। আর \n বা \t দিয়ে শুরু হলে কোনো বার্তাও আসে না।

JSON-এ ব্যাকস্ল্যাশের (\) পরে বসতে পারে শুধু কয়েকটি অক্ষর: উদ্ধৃতিচিহ্ন, ব্যাকস্ল্যাশ নিজে, স্ল্যাশ (/), b, f, n, r, t আর u। উইন্ডোজের পথ {"path":"C:\Users\rakib"} দিলে ব্যাকস্ল্যাশের পরে U আসে, আর টুল বলে Bad escaped character in JSON at position 12 (line 1 column 13)। প্রোগ্রামিং ভাষার \x41 রূপও এখানে চলে না, একই ধরনের বার্তা আসে।

সমাধান: প্রতিটি ব্যাকস্ল্যাশ দুটি করে লিখুন। {"path":"C:\\Users\\rakib"} সঠিক, আর এর আসল মান C:\Users\rakib (এক ব্যাকস্ল্যাশ)। টুলের ফলে দুটিই দেখাবে, এটি ভুল নয়।

আরেকটি, বেশি বিপজ্জনক দিক: {"p":"C:\new"} বা C:\temp কোনো ভুলের বার্তা দেয় না। কারণ \n আর \t JSON-এর নিজস্ব চিহ্ন; টুল \n-কে নতুন লাইন আর \t-কে ট্যাব ধরে নেয়। ফলে পথের মানটি আর C:\new থাকে না, ভেতরে একটি নতুন লাইনের চিহ্ন ঢোকে। ফল দেখে ঠিক মনে হয়, তাই পথ লিখলে সবসময় ব্যাকস্ল্যাশ দ্বিগুণ করুন।

ফাঁদ ৩: লেখার ভেতরে উদ্ধৃতিচিহ্ন

{"s":"তিনি বললেন "হ্যাঁ""} দিলে বার্তা আসে Expected ',' or '}' after property value in JSON at position 18 (line 1 column 19)। ১৭ নম্বর অক্ষরের উদ্ধৃতিচিহ্নকে ব্রাউজার লেখার শেষ ধরে নেয়, তাই তার পরের “হ” অক্ষরে এসে সে থামে।

এখানে একটি জিনিস লক্ষ করুন: position গোনা হয় অক্ষরের ছোট একক ধরে, চোখে দেখা বর্ণ ধরে নয়। “তিনি” দেখতে একটি শব্দ, কিন্তু ব্রাউজার গোনে ৪টি অক্ষর (ত, ি, ন, ি), আর “বললেন” ৫টি। বাংলা লেখায় তাই position সংখ্যা আন্দাজের চেয়ে বড় আসে। ভুল খুঁজতে position-এর পাশাপাশি line ও column দেখুন।

সমাধান: ভেতরের উদ্ধৃতিচিহ্নের আগে ব্যাকস্ল্যাশ বসান: {"s":"তিনি বললেন \"হ্যাঁ\""}। ফলে \" থেকেই যায়; JSON-এ লেখার ভেতরের উদ্ধৃতিচিহ্ন এভাবেই লেখা হয়।

ফাঁদ ৪: \u কোড, বাংলা লেখার বদলে সংখ্যা-কোড

কিছু API বা লগ বাংলা লেখাকে \u09ac\u09be\u0982\u09b2\u09be রূপে পাঠায়। এটি সঠিক JSON, পড়া যায় না। {"n":"\u09ac\u09be\u0982\u09b2\u09be"} টুলে বসিয়ে “ছোট করুন” চাপলে লেখাটি হয়ে যায় {"n":"বাংলা"}; ৩৮ অক্ষরের লেখা ১৩ অক্ষরে নামে। “সাজান” চাপলেও ফলে বাংলাই আসে, শুধু লাইন ভাঙে। ইমোজিও এভাবে আসে: \ud83d\ude00 দুটি কোড মিলে একটি 😀 হয়।

উল্টোটা টুল করে না। বাংলা লেখাকে সে \u কোডে বদলায় না, যেমন ছিল তেমনই রাখে। কোনো সিস্টেম \u কোডেই লেখা চাইলে এই টুলে হবে না। আরেকটি ছোট কথা: একা পড়ে থাকা \ud83d (জোড়ার অর্ধেক) টুল ভুল বলে না, ফলেও \ud83d-ই থাকে, কিন্তু ওটি দেখার মতো কোনো অক্ষর নয়।

ফাঁদ ৫: লেখার ভেতরে নতুন লাইন

{"s":"প্রথম\nদ্বিতীয়"} সাজালে ফলে \n লেখাই থাকে, লাইন ভাঙে না। এটি লেখার মানের ভেতরের নতুন-লাইন চিহ্ন, JSON-এর গড়নের লাইন নয়; অ্যাপ এটিকে দুই লাইন করে দেখাবে। বক্সে Enter চেপে লেখার মান দুই লাইনে ভাঙলে ভুলের বার্তা আসে, তা ভুল ধরার গাইডে আছে।

ফাঁদ ৬: JSON-এর ভেতরে JSON

কিছু সিস্টেমে একটি JSON অন্য JSON-এর লেখার মান হয়ে থাকে: {"a":"{\"b\":1,\"c\":[1,2]}"}। টুল এটি সঠিক ধরে, কিন্তু a-এর মানকে সে একটি লেখা হিসেবেই রাখে, ভেতরেরটি সাজায় না। পুরো "{\"b\":1}" বসালেও একই: একটি লেখা, সাজালে একই লেখা ফেরে।

ভেতরেরটি সাজাতে হাতে খুলে নিতে হয়: মানটি কপি করুন, বাইরের উদ্ধৃতিচিহ্ন দুটি ফেলুন, আর প্রতিটি \" বদলে " করুন। তাতে পাওয়া যায় {"b":1,"c":[1,2]}, যা সাজালে ৭ লাইনের ফল দেয়। টুলে এই খোলার বোতাম নেই। ভেতরে \\ বা \n-এর মতো চিহ্ন থাকলে খোলা আরও জটিল; সেটি আমি চালিয়ে দেখিনি।

একসঙ্গে: ফারহানার তালিকা

ফারহানার লেখা {"পণ্য":"চা পাতা","দাম":৪৫০,"পথ":"D:\images\cha.jpg"} প্রথমবার চাপলে বার্তা আসে Unexpected token '৪' দিয়ে শুরু, অর্থাৎ বাংলা অঙ্ক। কনভার্টারে ইংরেজি অঙ্ক করে আবার চাপলে নতুন বার্তা: Bad escaped character in JSON at position 37 (line 1 column 38)। পার্সার প্রথম ভুলেই থামে, তাই দ্বিতীয় ভুলটি (পথ) এবার দেখা গেল। পথে ব্যাকস্ল্যাশ দ্বিগুণ করে D:\\images\\cha.jpg লিখলে “JSON সঠিক আছে।” আসে, আর সাজানো ফল ৫ লাইনের।

ফাঁদ ও সমাধান এক নজরে

লক্ষণকারণকী করবেন
Unexpected token-এর পাশে ১, ২ বা ৪-এর মতো বাংলা অঙ্কসংখ্যায় বাংলা অঙ্কডিজিট কনভার্টারে ইংরেজি অঙ্ক করুন; লেখার ভেতরের অঙ্কও বদলাবে মনে রাখুন
Bad escaped characterব্যাকস্ল্যাশের পরে অচল অক্ষরপ্রতিটি ব্যাকস্ল্যাশ দ্বিগুণ করুন
Expected ‘,’ or ‘}’ … বাংলা শব্দের মাঝখানেলেখার ভেতরে খোলা উদ্ধৃতিচিহ্নভেতরের উদ্ধৃতিচিহ্নের আগে ব্যাকস্ল্যাশ
কোনো বার্তা নেই, অথচ পথ বা লেখা ভাঙা\n বা \t নতুন লাইন ও ট্যাব হয়ে গেছেব্যাকস্ল্যাশ দ্বিগুণ করুন

সীমাবদ্ধতা ও হালনাগাদ: সব বার্তা ও ফল Node 22-এ একই JSON.parse ও JSON.stringify চালিয়ে পাওয়া, আর ডিজিট কনভার্টারের ফল টুলের আসল toEn() কোড থেকে। আসল ব্রাউজারে টুল খুলে প্রতিটি লেখা বসিয়ে দেখিনি। Firefox ও Safari-র বার্তার ভাষা আলাদা হতে পারে, তবে জায়গার তথ্য সাধারণত থাকে। নাম, দাম ও পথ সব কাল্পনিক। হালনাগাদ: ৫ নভেম্বর ২০২৬।

সাধারণ প্রশ্ন

বাংলা কী-র নাম দেওয়া যায়?

যায়। কী-ও একটি লেখা, তাই বাংলা চলে, শুধু দ্বৈত উদ্ধৃতিচিহ্নে ঘেরা থাকতে হবে। তবে যে প্রোগ্রাম এই ডেটা পড়বে, সে বাংলা কী-র নাম নিতে পারবে কি না, তা আলাদা করে দেখে নিন।

টুল কি বাংলাকে \u কোডে বদলাতে পারে?

না। উল্টোটা পারে: \u কোডকে বাংলা লেখায় ফেরায়।

পুরোনো বিজয় কোডে লেখা বাংলা JSON-এ বসালে কী হয়?

বিজয় কোডের বাংলা সাধারণ ইংরেজি অক্ষর ও চিহ্নের মতো দেখায়, তাই JSON যাচাই সম্ভবত ভুল ধরবে না, অথচ লেখা পড়া যাবে না। এটি সাধারণ জ্ঞান, আমি টুলে চালিয়ে দেখিনি। আগে বিজয় থেকে ইউনিকোড কনভার্টারে লেখাটি ইউনিকোড করে নিন।

ডিজিট কনভার্টার শুধু সংখ্যা বদলায়?

সে শুধু অঙ্কের চিহ্ন বদলায়, অন্য অক্ষর ছোঁয়ে না। কিন্তু JSON-এর সংখ্যা আর লেখার ভেতরের অঙ্ক সে আলাদা করে না, দুটিই বদলে দেয়।