লেখা কেন \u4e2d\u6587 হয়ে যায়
সংক্ষেপে: \u4e2d\u6587 এস্কেপ বৈধ ইউনিকোড, এনকোডিং ব্যর্থতা নয়। আসল mojibake আলাদা দেখায়, আর দুইটা আলাদা করা ঠিক করে দেয় আসলে কী ঠিক করতে হবে।

মূল কথা: \uXXXX আউটপুটকে বৈধ এস্কেপিং ধরুন, নিশ্চিত করুন তা JSON.parse দিয়ে round-trip করে, আর পাঠযোগ্য লেখা চাইলে ensure_ascii=False-এর মতো pure-ASCII সিরিয়ালাইজেশন বন্ধ করুন; কেবল এমন পরিবহনে এস্কেপিং রাখুন যা নন-ASCII বহন করতে পারে না।
কারণ এটি এস্কেপ হয়েছে, নষ্ট হয়নি।
JSON.parse('"\\u4e2d\\u6587"') // "中文"
\u4e2d হলো 中 আর \u6587 হলো 文। এগুলো বৈধ এস্কেপ ক্রম; যেকোনো পার্সার ফিরিয়ে দেয়। কিছুই ভাঙেনি — লগ, ডিফ ও প্যাকেট ক্যাপচারে কেবল অপাঠ্য।
কে এস্কেপ করে
| টুল | ডিফল্ট | টগল |
|---|---|---|
Python json.dumps |
এস্কেপ করে (ensure_ascii=True) |
ensure_ascii=False |
JavaScript JSON.stringify |
এস্কেপ নেই | — |
| Java Jackson | এস্কেপ নেই | ঐচ্ছিক |
PHP json_encode |
৫.৪ থেকে এস্কেপ নেই | — |
Go encoding/json |
এস্কেপ নেই | — |
Python বহুলাংশে সবচেয়ে সাধারণ উৎস। ডিফল্টের কারণ আছে: pure ASCII আউটপুট যেকোনো পরিবহনে টেকে। দাম হলো প্রতিটি নন-ASCII অক্ষর ছয় অক্ষর হয়ে যায়।
এস্কেপিং বনাম mojibake
এস্কেপিং: \u4e2d\u6587, \uXXXX-এর সঙ্গে মেলে। সিরিয়ালাইজার সেটিং থেকে।
Mojibake: 测试, 涓枃। UTF-8 বাইট লিখে সেগুলো Latin-1 বা GBK হিসেবে পড়া থেকে।
দ্রুত পরীক্ষা: টেক্সট ব্রাউজার কনসোলে JSON.parse('"…"') হিসেবে পেস্ট করুন। পাঠযোগ্য ফিরে এলে তা এস্কেপিং ছিল। ব্যর্থ বা তবু এলোমেলো থাকলে তা এনকোডিং না-মেলা — আর সমাধান এনকোডিং মেলানো, সিরিয়ালাইজার ছোঁয়া নয়।
বন্ধ করা
json.dumps(data, ensure_ascii=False)
তারপর ডাউনস্ট্রিম যাচাই করুন: কিছু লিগ্যাসি সিস্টেম সত্যিই ASCII-only পরিবহনের উপর নির্ভর করে, বিশেষত SMS গেটওয়ে ও পুরোনো মেইল রিলে।
কখন এস্কেপিং সঠিক পছন্দ
- নন-ASCII-র প্রতি প্রতিকূল পরিবহন (লিগ্যাসি HTTP হেডার, কিছু SMS গেটওয়ে)
- অন্য JSON স্ট্রিংয়ের ভেতরে নেস্টেড JSON, যেখানে এস্কেপিং কোট-সংঘর্ষ কমায়
- বাইটে truncate করা লগ পাইপলাইন যা মাল্টি-বাইট অক্ষর ভাগ করে ফেলত
অন্যথায় পাঠযোগ্যতাকে অগ্রাধিকার দিন ও বন্ধ করুন।
সাধারণ প্রশ্ন
Python ডিফল্টে লেখা এস্কেপ করে কেন?
কারণ ensure_ascii=True ডিফল্ট, যা যেকোনো পরিবহনে টেকা pure ASCII আউটপুট নিশ্চিত করে। দাম হলো প্রতিটি নন-ASCII অক্ষর ছয় অক্ষর হয়ে যায়।
ensure_ascii বন্ধ করা উচিত?
পাঠযোগ্যতা গুরুত্বপূর্ণ হলে বন্ধ করুন। তারপর ডাউনস্ট্রিম যাচাই করুন — লিগ্যাসি HTTP হেডার, কিছু SMS গেটওয়ে ও বাইটে truncate করা লগ পাইপলাইন তবু ASCII-only কন্টেন্টের উপর নির্ভর করতে পারে।
পরিবহন নন-ASCII বহন করতে না পারলে কী হয়?
এস্কেপিং রাখুন। JSON অন্য JSON স্ট্রিংয়ের ভেতরে এম্বেড হলে, বা নন-ASCII-র প্রতি প্রতিকূল চ্যানেলে গেলে, এস্কেপিং কোট-সংঘর্ষ এড়ায় ও মাল্টি-বাইট অক্ষর ভাগ হওয়া ঠেকায়।