কোনও আরবি, ফারসি বা উর্দু শিরোনাম যখন দোকানে গিয়ে বন্ধনী উল্টো দিকে নিয়ে হাজির হয়, বা "feat." কৃতিত্বটি একেবারে শেষ প্রান্তে ঠেলে দেয়, বা একটি ক্যাটালগ নম্বর যেখানে থাকার কথা নয় সেখানে ভাসতে থাকে, তখন কিছুই নষ্ট হয়নি। আপনি যে বাইটগুলি টাইপ করেছেন প্রায় সবসময় সেই বাইটগুলিই পৌঁছেছে। যা বদলেছে তা হল যে বাক্সে লেখাটি আঁকা হচ্ছে তার ভিত্তি-দিক, আর সেটি ঠিক করে দোকানের পাতা, আপনার শিরোনাম নয়। এই লেখাটি কলকব্জাটি এমন নিখুঁতভাবে ব্যাখ্যা করে যাতে সরবরাহের আগেই আপনি আন্দাজ করতে পারেন আপনার কোন শিরোনামগুলি ভাঙবে।
শুরুতেই একটি কথা বলা দরকার, কারণ এটিই সৎ অবস্থান: আরবি-হরফের মেটাডেটার ত্রুটির হার নিয়ে এই শিল্পে কোথাও কোনও প্রকাশিত পরিমাপের কথা আমরা জানি না। সমস্যাটি সর্বজনীনভাবে ভোগা হয় আর একেবারেই পরিমাপ করা হয়নি। নিচে কোনও সংখ্যা নেই, কারণ দেওয়ার মতো কোনও সংখ্যাই নেই।
যৌক্তিক ক্রম আর প্রদর্শনের ক্রম দুটি আলাদা জিনিস
Unicode লেখা সঞ্চয় করে যৌক্তিক ক্রমে — অর্থাৎ যে ক্রমে আপনি বলেন, টাইপ করেন আর পড়েন। প্রদর্শনের ক্রম তা থেকে রেন্ডারের সময় হিসাব করা হয়, Unicode Standard Annex #9 (UAX #9)-এ সংজ্ঞায়িত Unicode Bidirectional Algorithm দিয়ে। এই পরিশিষ্টটি এই বিভাজন নিয়ে সাফ কথা বলে: "The Unicode Standard prescribes a memory representation order known as logical order," আর "When working with bidirectional text, the characters are still interpreted in logical order—only the display is affected."
ওই একটি বাক্যই সেই ঘটনাটি ব্যাখ্যা করে যার জেরে আরবি-হরফের শিল্পীরা ভাবেন তাঁদের মেটাডেটায় ভূত আছে: সঞ্চিত স্ট্রিংটি নিখুঁতভাবে ঠিক থাকতে পারে অথচ প্রদর্শন ভুল হতে পারে, আবার দেখতে ঠিক থাকতে পারে অথচ সঞ্চিত বাইট ভুল হতে পারে — আর পর্দায় এই দুই ব্যর্থতা হুবহু একরকম দেখায়। তাকিয়ে দেখে আপনি এটি নিরীক্ষা করতে পারবেন না। আপনার পরিবেশকের সহায়তা প্রতিনিধিও পারবেন না।
একটি RTL স্ট্রিংয়ের ভিতরে ল্যাটিন শব্দ কেন সরে যায়
UAX #9 প্রতিটি অক্ষরকে একটি দ্বিমুখী শ্রেণি দেয়। আরবি, ফারসি ও উর্দু অক্ষর হল AL (ডান-থেকে-বাম আরবি অক্ষর)। ল্যাটিন অক্ষর হল L। ASCII অঙ্ক হল EN (European Number), আরবি-ইন্ডিক অঙ্ক হল AN (Arabic Number)। স্পেস আর বেশিরভাগ যতিচিহ্ন — বন্ধনী, তৃতীয় বন্ধনী, হাইফেন ও দাঁড়িসহ — নিরপেক্ষ, অর্থাৎ তাদের নিজস্ব কোনও দিক নেই আর তারা চারপাশ থেকে দিক ধার করে।
দুটি নিয়মগুচ্ছই ক্ষতিটা করে।
অনুচ্ছেদের দিক, নিয়ম P2–P3। অ্যালগরিদম প্রথম শক্ত দিকনির্দেশক অক্ষর খোঁজে আর তা থেকে ভিত্তি-দিক ঠিক করে। যে শিরোনাম একটি ল্যাটিন শব্দ দিয়ে শুরু হয়, তার ভিত্তি-দিক হয় বাম-থেকে-ডান, তার পরে সবটা ফারসি হলেও।
নিরপেক্ষ নিষ্পত্তি, নিয়ম N1–N2। নিয়ম N1: "A sequence of [neutrals] takes the direction of the surrounding strong text if the text on both sides has the same direction." নিয়ম N2: যেসব নিরপেক্ষ অক্ষরে কোনও ঐকমত্য নেই, তারা অনুচ্ছেদের দিক নেয়। তারপর নিয়ম L2 প্রদর্শনের জন্য ক্রম বদলায় — "reverse any contiguous sequence of characters that are at that level or higher."
এগুলি একসঙ্গে রাখলে ব্যর্থতাটি এলোমেলো নয়, নির্ধারিত। একটি ল্যাটিন শব্দ — একজন রিমিক্সারের নাম, feat., Vol. 2, একটি ক্যাটালগ নম্বর, একটি সাল — চারপাশের আরবির চেয়ে আলাদা একটি এমবেডিং স্তরে বসে। তার সীমানার নিরপেক্ষ অক্ষরগুলির (স্পেস, খোলা বন্ধনী) এক পাশে আরবি আর অন্য পাশে ল্যাটিন, তাই N1 কোনও ঐকমত্য পায় না আর N2 তাদের হাতে অনুচ্ছেদের দিক ধরিয়ে দেয়। আপনার ডান-থেকে-বাম টেক্সট এডিটরে যে বন্ধনী একদিকে নিষ্পত্তি হয়েছিল, একটি বাম-থেকে-ডান দোকানের পাতায় সেটি অন্য দিকে নিষ্পত্তি হয়, আর বন্ধনীটি খুলে গিয়ে উল্টে যায়।
তাই نام آهنگ (Nima Remix) ভাঙা নয়। এটি একটি স্ট্রিং, দুটি প্রেক্ষাপটে নিষ্পত্তি হচ্ছে। ভিত্তি-দিক প্রেক্ষাপট, বিষয়বস্তু নয়, আর দোকানের প্রেক্ষাপট আপনার নয়।
যে কাজটি আপনার কখনও করা উচিত নয়
প্রিভিউ ঠিক দেখানো পর্যন্ত অক্ষরগুলি উল্টো করে টাইপ করে প্রদর্শনটি "সারিয়ে" তোলার চেষ্টা করবেন না।
তাতে এমন একটি স্ট্রিং তৈরি হয় যা যৌক্তিক ক্রমে ভুল, ঠিক একটিমাত্র রেন্ডারিং প্রেক্ষাপটে ঠিক, আর বাকি সর্বত্র ভাঙা — অনুসন্ধান, বাছাই, শিল্পী মেলানো, আর যে দোকানের পাতার ভিত্তি-দিক আপনার সারানোর টুলটির থেকে আলাদা, সবকটি সহ। আপনি একটি প্রদর্শনের সমস্যাকে, যা সারানো যায়, একটি ডেটার সমস্যায় বদলে ফেলবেন, যা সারানো যায় না।
UAX #9 এটি স্পষ্টভাবে নিয়ন্ত্রণের জন্য অক্ষর সংজ্ঞায়িত করে বটে: আইসোলেট LRI, RLI, FSI ও PDI, আর চিহ্ন LRM, RLM ও ALM। প্রযুক্তিগতভাবে সেগুলিই সঠিক সমাধান। সেগুলি আবার অদৃশ্য বিন্যাস-অক্ষরও, আর বহু ডেলিভারি পাইপলাইন অদৃশ্য বিন্যাস-অক্ষর না জানিয়েই ছেঁটে দেয়। মেটাডেটার ঘরে সেগুলিকে অনির্ভরযোগ্য ধরুন।
কাঠামোগত সমাধান: ল্যাটিন শব্দটিকে মাঝখান থেকে সরান
যে প্রশমনটি সর্বত্র, প্রতিটি রেন্ডারারে, কোনও অদৃশ্য অক্ষর ছাড়াই কাজ করে, সেটি কাঠামোগত। পছন্দের ক্রমে:
- ডেটা মডেল যেখানেই আলাদা ঘর দেয়, মিশ্র-দিকের স্ট্রিংয়ের বদলে সেই ঘরগুলি ব্যবহার করুন। অতিথি শিল্পীর জায়গা শিল্পী-ভূমিকার স্তরে, শিরোনামে নয়। Music Biz-এর Music Metadata Style Guide পরামর্শ দেয় যে অতিথি শিল্পীদের কৃতিত্ব শিল্পী-ভূমিকার স্তরে দিতে হবে আর ওই তথ্য ট্র্যাক বা অ্যালবাম প্রকাশের শিরোনামে যোগ করা যাবে না; Spotify-র প্রকাশ্য নির্দেশনা হল "You shouldn't include any artists' names in your track or release titles." একটি সংস্করণের জায়গা সংস্করণের ঘরে, যার গোটা কাজই হল একই শিরোনামের দুটি রেকর্ডিংকে আলাদা করা। আপনি যত ল্যাটিন শব্দ তার নিজের ঘরে সরিয়ে দেন, ততগুলি দ্বিমুখী সীমানা অস্তিত্ব হারায়।
- অনিবার্য কোনও ল্যাটিন শব্দকে প্রথম অবস্থানের বাইরে রাখুন। প্রথম অবস্থান P2–P3 অনুযায়ী অনুচ্ছেদের দিক ঠিক করে। ল্যাটিন শব্দ দিয়ে শুরু হওয়া একটি ফারসি শিরোনাম আসলে ফারসিভরা একটি বাম-থেকে-ডান অনুচ্ছেদ, যা আপনি বোঝাতে চাননি।
- দিকের সীমানায় সাজসজ্জার যতিচিহ্ন এড়ান। ড্যাশ, স্ল্যাশ, পাইপ আর স্তরে স্তরে বন্ধনী সবই নিরপেক্ষ, আর সেগুলি ঠিক সেখানেই বসে যেখানে অ্যালগরিদমের হাতে সবচেয়ে কম তথ্য থাকে।
চুক্তিতে যেখানে সত্যিই শিরোনামে কৃতিত্বটি দরকার, সেখানে রীতিগুলি নির্দিষ্ট আর হুবহু মেনে চলার যোগ্য। Music Biz, "feat." ও "with" প্রসঙ্গে: "when included in the title are generally lowercase and in English." Apple-এর স্টাইল গাইড: "Formatting of 'feat.' and 'with' must be lowercase, in English, not localized, and in parentheses or brackets." ওই "not localized" নির্দেশটি এখানে সত্যিকারের কাজ করছে — শিরোনামের ঘরে "feat." কথাটি আরবি, ফারসি বা উর্দুতে অনুবাদ করবেন না। এটি একটি যন্ত্র-পাঠযোগ্য টোকেন, কোনও শব্দ নয়।
অঙ্ক, আর আপনার অঙ্কগুলি কেন আপনার ভাবা অঙ্ক না-ও হতে পারে
তিনটি অঙ্ক-সেট এখানে জড়িত:
| সেট | কোড পয়েন্ট | ব্যবহার হয় | বিডি শ্রেণি |
|---|---|---|---|
| ASCII | 0–9 | সর্বত্র | EN |
| আরবি-ইন্ডিক | U+0660–U+0669 (٠١٢٣٤٥٦٧٨٩) | আরবি | AN |
| বর্ধিত আরবি-ইন্ডিক | U+06F0–U+06F9 (۰۱۲۳۴۵۶۷۸۹) | ফারসি, উর্দু | EN |
এগুলি কোনও সাজসজ্জার রূপভেদ নয়। এগুলি আলাদা কোড পয়েন্ট, আর Unicode Character Database অনুযায়ী এদের দ্বিমুখী শ্রেণিটুকুও এক নয়। UAX #9-এর নিয়ম W2 একটি ইউরোপীয় সংখ্যাকে আরবি সংখ্যায় পুনঃশ্রেণিভুক্ত করে যখন নিকটতম পূর্ববর্তী শক্ত অক্ষরটি একটি আরবি অক্ষর, তাই ফারসি লেখার ভিতরে দুটি প্রদর্শনের সময় একরকম আচরণ করতে পারে — কিন্তু বাছাই, অনুসন্ধান বা স্ট্রিং তুলনায় কখনওই নয়, কারণ সেগুলি আলাদা অক্ষর। বর্ধিত আরবি-ইন্ডিক ۲ দিয়ে টাইপ করা একটি "Vol. 2" আর ASCII 2 দিয়ে টাইপ করা একটি "Vol. 2" হল দুটি আলাদা স্ট্রিং, যারা দেখতে প্রায় হুবহু এক।
ক্যাটালগপিছু একটি অঙ্ক-সেট বেছে নিন আর একটি স্ট্রিংয়ের ভিতরে কখনও সেট মেশাবেন না।
আপনি আসলে কী টাইপ করেছেন তা কীভাবে দেখবেন
প্রদর্শনকে বিশ্বাস করা যায় না, তাই বাইট দেখুন। প্রতিটি সরবরাহের আগে তিনটি কাজ করার মতো:
- স্ট্রিংটি গ্লিফ হিসেবে নয়, কোড পয়েন্ট হিসেবে পড়ুন। যে টুলই আপনাকে U+ মান দেখায়, সেটিই তৎক্ষণাৎ বলে দেবে ওটি ফারসি ی (U+06CC) নাকি আরবি ي (U+064A), ফারসি ک (U+06A9) নাকি আরবি ك (U+0643) — এমন একটি পার্থক্য যা বেশিরভাগ ফন্ট চ্যাপ্টা করে দেয় আর কোনও প্রুফরিডারের চোখে পড়ে না। একই কথা খাটে ভুলে ঢুকে পড়া একটি তাতবিল (U+0640)-এর ক্ষেত্রে, যা Unicode-এর কোনও নর্মালাইজেশন রূপ সরায় না, আর একটি ফর্ম-ঘর যে জিরো-উইড্থ নন-জয়েনার (U+200C) নিঃশব্দে খেয়ে ফেলেছে তার ক্ষেত্রেও।
- শিরোনামটি একটি বাম-থেকে-ডান প্রেক্ষাপটে আর একটি ডান-থেকে-বাম প্রেক্ষাপটে বসিয়ে মিলিয়ে দেখুন। দুটিতে যতিচিহ্ন যদি আলাদা জায়গায় পড়ে, তবে আপনার হাতে একটি মিশ্র-দিকের স্ট্রিং আছে আর একটি ল্যাটিন শব্দ আছে যার নিজের ঘরে থাকা উচিত।
- আপনার আগের প্রকাশের সঙ্গে অক্ষর ধরে ধরে মেলান, চোখের আন্দাজে নয়। আরবি হরফে ভাগ হয়ে যাওয়া ক্যাটালগ প্রায় সবসময়ই এমন একটি পার্থক্যের কারণে হয় যা অদৃশ্য: একটি প্রকাশ ফারসি কিবোর্ড লেআউটে টাইপ করা, পরেরটি আরবি লেআউটে।
Mazufa-র সরঞ্জাম সম্পূর্ণভাবে আপনার ব্রাউজারে চলে — কোনও অডিও আর কোনও লেখা আপলোড হয় না — আর শিরোনাম ডান-থেকে-বাম হলে সেগুলি স্বয়ংক্রিয়ভাবে dir="rtl" বসায়, যাতে টাইপ করার সময় আপনি যা দেখেন তা ওই স্ট্রিংটি যে প্রেক্ষাপটের জন্য লেখা হয়েছিল তার সঙ্গে মেলে। mazufa.com একটি বিনামূল্যের মেটাডেটা চেকারও রাখে, যা আপনার নিজের ডিভাইসে চলে আর অদৃশ্য কয়েকটি ক্ষেত্র ধরিয়ে দেয়: মিশ্র অঙ্ক-সেট, তাতবিল, ভুলে ঢোকা বা অনুপস্থিত ZWNJ, আরবি বনাম ফারসি ইয়ে ও কাফ, আর NFC নয় এমন স্ট্রিং।
সরবরাহের আগে যা করবেন
আপনার পরের প্রকাশের শিরোনাম আর শিল্পীর নাম নিয়ে চারটি কাজ করুন। যত ল্যাটিন শব্দ সরানো যায় সব তার নিজের ঘরে সরান — অতিথি শিল্পী শিল্পী-ভূমিকায়, সংস্করণ সংস্করণের ঘরে। দেখে নিন কিছুই যেন ল্যাটিন শব্দ দিয়ে শুরু না হয়। আপনার অঙ্ক-সেট এক করুন আর সব তাতবিল সরান। তারপর স্ট্রিংটি একবার কোড পয়েন্ট হিসেবে পড়ুন, আর ঠিক ওই স্ট্রিংটিই সেই আদর্শ বানান হিসেবে সংরক্ষণ করুন যা ভবিষ্যতের প্রতিটি প্রকাশে নতুন করে টাইপ না করেই আপনি ব্যবহার করবেন।
কোনও শিরোনামকে যদি তবু মাঝখানে একটি ল্যাটিন শব্দ বইতে হয়, তবে সেটি সরবরাহ করুন আর মেনে নিন যে বিভিন্ন জায়গায় সেটি বিভিন্নভাবে রেন্ডার হবে। ওটি প্রদর্শনের একটি ফল, ক্ষতি নয়। স্ট্রিংটি ঠিক আছে। একটি প্রিভিউ ঠিক দেখাতে সেটি উল্টো করে টাইপ করাই একমাত্র উপায় যাতে সেটি সত্যিই ভুল হয়ে যায়।
সূত্র
- Unicode Standard Annex #9, Unicode Bidirectional Algorithm (Revision 51, Unicode 17.0.0, 2025-08-13) — https://www.unicode.org/reports/tr9/
- Unicode Standard Annex #15, Unicode Normalization Forms (Version 57, Unicode 17.0.0, 2025-07-30) — https://www.unicode.org/reports/tr15/
- Unicode Character Database — অক্ষরের বৈশিষ্ট্য: দ্বিমুখী শ্রেণি, বিয়োজন মানচিত্র — https://www.unicode.org/ucd/
- Music Business Association, Music Metadata Style Guide v2.1 — https://www.musicbiz.org/wp-content/uploads/2016/04/MusicMetadataStyleGuide_V2.1.pdf
- Apple Music Style Guide — https://help.apple.com/itc/musicstyleguide/en.lproj/static.html
- Spotify for Artists, Music metadata guidelines — https://support.spotify.com/us/artists/article/metadata-formatting-guidelines/
এই নথিগুলির সংস্করণ ও সংশোধনের তারিখ সংগ্রহে উপরে দেওয়া হিসেবেই আছে, আর সেগুলির জন্য আলাদা কোনও পড়ার তারিখ নথিভুক্ত নেই।