النصّ في ملف بايتات. لا بدّ لشيء أن يقرّر أي بايت يعني أي حرف، وطوال ثلاثين سنة تقريبًا قرّر كلٌّ على نحو مختلف — ترميز لكل منطقة، كلّها تستعمل قيم البايتات نفسها لمحارف مختلفة.
حلّ Unicode النصف الأول بإسناد رقم لكل محرف في كل نظام كتابة. ثم حلّ UTF-8 النصف الثاني باختيار كيفية كتابة تلك الأرقام بايتاتٍ، وفعلها على نحو جعل التبنّي شبه مجّاني.
فكرتان، تبقيان منفصلتين
Unicode فهرس. الحرف A هو 65، والألف العربية 1575، ورمز تعبيري في مكان ما فوق 128,000. أرقام فقط، بلا تخزين.
UTF-8 طريقة لتخزين تلك الأرقام. UTF-16 وUTF-32 طريقتان أخريان. الملف الموصوف بكلمة «Unicode» وحدها لم يخبرك بالشيء الذي تحتاجه لقراءته، ولهذا لا تنفع تلك الكلمة في قائمة ترميزات.
لماذا انتصر UTF-8
يستعمل بايتًا واحدًا لأول 128 محرفًا — مجموعة ASCII بالضبط، بقيم ASCII بالضبط.
أي أن كل ملف ASCII كان أصلًا ملف UTF-8، دون تغيير، وكل برنامج يتعامل مع ASCII ظلّ يعمل. لا شيء وجب تحويله ولا شيء وجبت إعادة كتابته يوم التحوّل. ذلك التوافق مع الماضي هو السبب كلّه في إزاحته للبدائل.
خارج ASCII يستعمل بايتين لمعظم كتابات أوروبا والشرق الأوسط، وثلاثة لمعظم الكتابات الآسيوية، وأربعة للرموز التعبيرية والكتابات الأندر. النص الإنجليزي في معظمه لا يكلّف شيئًا تقريبًا؛ والنص الصيني في معظمه يكلّف 50% أكثر ممّا كان سيكلّفه UTF-16، وتلك هي المقايضة التي قُبلت.
له أيضًا خاصّية تبقي المحلّلات على استقامتها: البايت الأول من المحرف يقول كم بايتًا يتبعه، فتستطيع القفز إلى وسط ملف وإيجاد حدّ المحرف التالي. UTF-16 لا يقدر على ذلك.
علامة ترتيب البايتات
UTF-16 يأتي بنكهتين تبعًا لأي طرف من الرقم ذي البايتين يأتي أولًا، فهو يحتاج علامة في أول الملف تقول أيّهما. تلك العلامة هي علامة ترتيب البايتات.
UTF-8 بايتاته مفردة، فلا ترتيب بايتات فيه ليُعلَّم. هو لا يحتاج واحدة.
حصل عليها مع ذلك، توقيعًا: البايتات الثلاثة EF BB BF، بمعنى «هذا الملف UTF-8». تبيّن أن ذلك مفيد فعلًا لصيغة بلا موضع تعلن فيه ترميزها — أي لـCSV.
لماذا يحتاجها Excel وتكرهها المحلّلات
انقر نقرة مزدوجة على ملف CSV بترميز UTF-8 بلا BOM في Excel فيتشوّه النص خارج ASCII، لأن Excel يفترض ترميزًا إقليميًّا قديمًا. أضف BOM فيُفتح سليمًا. هذه أنفع حقيقة منفردة في هذا المقال.
الثمن أن كل ما عداه يرى ثلاثة بايتات غير متوقّعة قبل المحرف الأول. المحلّل الذي يقرأ صف الترويسة يجد العمود الأول اسمه \uFEFFid بدل id، فيفشل البحث بخطأ يعرض سلسلتين تبدوان متطابقتين.
لهذا وُجد utf-8-sig: اقرأ به فتُزال العلامة؛ اكتب به فتُضاف. أما utf-8 المجرّد فيتركها وشأنها في الاتّجاهين.
فالقاعدة إذن عن الوجهة. الملف الذاهب إلى برنامج جداول يأخذ BOM؛ والذاهب إلى برنامج لا يأخذها. حين يكون الاثنين معًا، أضفها وأخبر البرنامج أن يتوقّعها.
الطلاسم، ولماذا يمكن استرجاعها
حين ترى Ø£ØÙ…د أو café، تكون بايتات UTF-8 قد قُرئت ترميزًا أحادي البايت. كل محرف حقيقي صار المحرفين أو الثلاثة التي تعنيها بايتاته في ذلك النظام الآخر.
الجزء المهمّ: لم يُفقد شيء. البايتات على القرص صحيحة والقارئ مخطئ، فإخبار القارئ بالترميز الصحيح يستعيد النص تمامًا.
لا يصير غير قابل للاسترجاع إلا حين تُحفظ النسخة المشوّهة. عندها تصير المحارف الخاطئة هي المحتوى الحقيقي، ويعني التراجع عن ذلك عكسَ سوء التأويل بعينه — وهو ينجح حين تستطيع تحديده، لا غير ذلك.
قواعد عملية
أعلنه حيثما استطعت: <meta charset="utf-8"> أول شيء في ترويسة HTML، وcharset=utf-8 في ترويسة نوع المحتوى، وUTF-8 ترميزًا لقاعدة البيانات وللاتّصال.
في MySQL، استعمل utf8mb4 لا utf8. فالمسمّى utf8 مجموعة جزئية بثلاثة بايتات لا تستطيع تخزين الرموز التعبيرية ولا عدّة كتابات، وهو فخّ قديم.
لا تفترض أبدًا ترميز ملف أُرسل إليك. انظر فيه، أو اسأل.
الخلاصة
Unicode يرقّم المحارف؛ وUTF-8 يخزّن تلك الأرقام بايتاتٍ، مطابقًا لـASCII بايتًا ببايت في أول 128. BOM توقيع اختياري من ثلاثة بايتات يعتمد عليه Excel وتتعثّر به المحلّلات. الطلاسم خطأ قراءة لا تلف — إلى أن يحفظها أحد.