ترميز كلمة عربية إلى Base64 في أداة أخرى أعطاني خطأ أو رموزًا غريبة عند فكها، فلماذا يحدث هذا مع العربية؟
لأن الدالة المختصرة btoa في المتصفحات تقبل فقط الحروف التي تُكتب ببايت واحد، والحرف العربي ليس منها، فإما أن تفشل أو يخرج النص مشوّهًا في مرحلة ما. هذه الأداة تحوّل النص أولًا إلى بايتات UTF-8، بايتين لكل حرف عربي، ثم ترمّز البايتات، وتعكس الخطوتين عند الفك، فتعود الكلمة كما هي.
Base64 يرمّز بايتات لا حروفًا
Base64 لا يعرف شيئًا عن الحروف. هو يأخذ سلسلة بايتات ويكتبها بأربعة وستين رمزًا. لذلك قبل أي ترميز يجب أن يتحول النص إلى بايتات، والسؤال هو: بأي طريقة؟ الطريقة المتفق عليها اليوم هي UTF-8، وفيها يأخذ الحرف العربي بايتين، والحرف اللاتيني بايتًا واحدًا.
الدالة btoa، وهي أقدم طريقة سريعة في المتصفحات، لا تحوّل إلى UTF-8. هي تفترض أن كل حرف بايت واحد. جربناها على كلمة «مرحبا» فرفضت برسالة Invalid character، لأن الحروف العربية لا تُكتب ببايت واحد. بعض الأدوات تتحايل على ذلك بطرق مختلفة، فتنجح في الترميز لكنها تترك مشكلة تظهر عند الفك.
الرموز الغريبة عند الفك
الوجه الآخر للمشكلة يظهر حين يكون الترميز صحيحًا والفك قديمًا. أخذنا الترميز الصحيح لكلمة «مرحبا» وفككناه بالدالة atob، الشريكة القديمة لدالة btoa، فخرج هذا بدل الكلمة:
ÙØ±ØØ¨Ø§
البايتات العشرة صحيحة، لكن كل بايت قُرئ حرفًا مستقلًا بدل أن يُقرأ كل بايتين حرفًا عربيًا واحدًا. إن رأيت رموزًا مثل Ù وØ في نص كان يجب أن يكون عربيًا، فهذه غالبًا علامة هذا الخطأ.
ما الذي تفعله هذه الأداة؟
رمّزنا «مرحبا» فكان الناتج:
2YXYsdit2KjYpw==
وذكرت الأداة أن الترميز شمل 10 بايتات، لخمسة حروف. ثم فككنا الناتج فعادت «مرحبا» كما هي. وجربنا عبارة فيها أرقام ومسافات، «سعر 45 ريال»، فكانت 18 بايتًا: سبعة حروف عربية ببايتين لكل منها، ثم رقمان ومسافتان ببايت لكل منها.
- افتح ترميز وفك Base64 واختر «ترميز».
- اكتب النص العربي أو الصقه.
- انسخ الناتج. للتأكد، اختر «فك الترميز» والصقه، فيجب أن يعود نصك حرفًا بحرف.
لماذا الناتج أطول مما تتوقع؟
كل 3 بايتات تصبح 4 رموز في Base64. ومع العربية يتضاعف عدد البايتات أولًا، فكلمة من خمسة حروف صارت 16 رمزًا بعلامتي الحشو. هذا طبيعي وليس خطأ، ويعني أن حقلًا محدود الطول في نظام ما قد يمتلئ بالعربية أسرع مما يمتلئ بالإنجليزية.
تذكير: هذا ليس تشفيرًا
أي شخص يستطيع فك الناتج في ثانية، كما فعلنا هنا. إن كان الهدف إخفاء كلمة مرور أو معلومة عميل، فإن Base64 لا يؤدي هذا الغرض. وإن كان النص العربي سيوضع في رابط لا في Base64، فالأداة المناسبة لذلك هي ترميز وفك ترميز الروابط.
أسئلة شائعة
هل تنجح الأداة مع الرموز التعبيرية؟
نعم، لأنها تمر عبر UTF-8 أيضًا. الرمز التعبيري يأخذ عادة أربعة بايتات.
وصلني نص Base64 من نظام قديم ويظهر مشوّهًا في هذه الأداة، لماذا؟
إن لم تكن البايتات UTF-8 صالحًا، لا تعرض الأداة نصًا مشوّهًا، بل تقول إن الناتج ليس نصًا وتتيح تنزيل البايتات. قد يكون النص الأصلي بترميز قديم.
هل الترميز نفسه يختلف بين الأدوات؟
للنص نفسه بترميز UTF-8 يجب أن يكون الناتج واحدًا. الاختلاف يأتي من طريقة تحويل الحروف إلى بايتات قبل الترميز.
