محوّل النص إلى ثنائي

حوّل النص إلى ثنائي (بايتات UTF-8 مكوّنة من 8 بتات) والعكس صحيح — كلا المربعين متزامنان ويعملان في الاتجاهين.

1,140 مشاهدة

كيف يعمل

النص لا يُحوَّل إلى ثنائي حرفًا بحرف — بل يُحوَّل بايتًا بايتًا، بعد ترميزه أولًا بصيغة UTF-8. هذا الفرق مهم لأن الحرف الواحد لا يشغل دائمًا بايتًا واحدًا. عند كتابة حرف ASCII (الحروف الإنجليزية البسيطة والأرقام وعلامات الترقيم، نقاط الكود 0-127) فإنه يسع تمامًا في بايت واحد، لذا يصبح A مجموعة ثنائية واحدة من 8 بتات: 01000001. تحتاج معظم الأحرف غير الإنجليزية إلى مساحة أكبر. يُرمَّز الحرف التركي الكبير المنقّط İ (يونيكود U+0130) في UTF-8 كبايتين وليس بايتًا واحدًا: 11000100 10110000 — مجموعتان ثنائيتان منفصلتان من 8 بتات. يحتاج رمز تعبيري مثل 😀 (U+1F600) إلى أربعة بايتات: 11110000 10011111 10011000 10000000. تنفّذ هذه الأداة بالضبط هذا المسار — نص ← بايتات UTF-8 ← مجموعة ثنائية واحدة من 8 بتات لكل بايت، مفصولة بمسافات — لذا فإن كلمة تحتوي على "İ" أو "ğ" أو رمز تعبيري تنتج بشكل ملحوظ مجموعات أكثر مما يتوقعه الافتراض الساذج بأن حرفًا واحدًا يساوي بايتًا واحدًا.

البايتات الإضافية ليست عشوائية؛ بل تتبع نمط بتات ثابتًا يمكن لأي مفكِّك شيفرة يفهم UTF-8 (بما في ذلك هذه الأداة عند تنفيذ التحويل بالاتجاه المعاكس) التعرّف عليه. يبدأ البايت الأول من تسلسل متعدد البايتات بسلسلة من البتات 1 يتبعها 0 يُعلن عدد البايتات التي يتكوّن منها الحرف — 110xxxxx تعني "بايتان إجمالًا"، 1110xxxx تعني "3 بايتات"، 11110xxx تعني "4 بايتات" — بينما كل بايت يليه، وهو بايت استمرار، يبدأ دائمًا بالبادئة الثابتة 10xxxxxx. عند قراءة 11000100 10110000 لحرف İ: يرى المفكِّك 110 (بايت بداية لبايتين) يتبعه بايت يبدأ بـ 10 (بايت استمرار واحد بالضبط)، فيتأكد من اكتمال التسلسل، ويعيد بناء نقطة الكود اليونيكودية الواحدة U+0130 من البتات المتبقية في كلا البايتين مجتمعة. هذا أيضًا سبب أن أي بايت ضائع أو تالف في منتصف حرف متعدد البايتات يكسر عملية فك الترميز — إذ يجب أن تتطابق بادئة بايت الاستمرار، وإلا تعذّر إعادة تجميع الحرف.

ما يجب أن تعرفه

يعكس تحويل الثنائي إلى نص نفس المسار: تُقرأ المجموعات الثنائية من 8 بتات بالترتيب، وتُعاد تجميعها في تسلسلات بايتات UTF-8 كاملة عن طريق فحص بادئة كل بايت بداية لمعرفة عدد بايتات الاستمرار التي تنتمي إليه، ثم تُفكّ ترميزها إلى أحرف — لذا فإن سلسلة ثنائية مُنشأة بشكل صحيح تعود دائمًا إلى النص الأصلي بالضبط، بما في ذلك الأحرف التركية والرموز التعبيرية، لا إلى تقريب منه. هذا لا يعمل إلا لأن الثنائي هنا هو تحديدًا UTF-8: الثنائي الناتج عن ترميز مختلف (UTF-16، أو ترميز تركي أحادي البايت مثل ISO-8859-9/Windows-1254) يستخدم أعدادًا مختلفة من البايتات وأنماط بتات مختلفة لنفس الأحرف، ولصقه هنا سيُفكَّك إلى نص خاطئ أو يفشل تمامًا — فهذه ليست أداة عالمية لتحويل الثنائي إلى نص، بل أداة UTF-8 تحديدًا. ولأن التحويل بأكمله يعمل من جانب المتصفح، لا يُرسَل أي نص أو ثنائي تكتبه إلى أي مكان.

الأسئلة الشائعة

لماذا ينتج أحيانًا عن حرف واحد أكثر من 8 بتات؟

يُشفَّر النص أولًا بترميز UTF-8. تأخذ أحرف ASCII بايتًا واحدًا (8 بتات)، أما الحروف المنقّطة والأحرف التركية والرموز التعبيرية فقد تأخذ من 2 إلى 4 بايتات — يظهر كل بايت كمجموعته الثنائية المستقلة من 8 بتات، لذا يمكن لحرف واحد أن يتمدد بشكل مشروع إلى 16 أو 24 أو 32 بتًا.

لماذا تحتاج الأحرف التركية مثل İ وğ وş إلى مجموعتين ثنائيتين بدلاً من واحدة؟

لأنها تقع خارج نطاق ASCII من 0 إلى 127، فإن UTF-8 يرمّزها كتسلسلات من بايتين: بايت بداية يبدأ بـ 110xxxxx يتبعه بايت استمرار واحد يبدأ بـ 10xxxxxx. فمثلًا، يُكتب İ كـ 11000100 10110000 — مجموعتان تمثلان حرفًا واحدًا.

هل يمكنني تحويل الرموز التعبيرية، وكم بت تحتاج؟

نعم. تقع معظم الرموز التعبيرية في موضع مرتفع بما يكفي في يونيكود بحيث تحتاج إلى الصيغة الكاملة من 4 بايتات في UTF-8: بايت بداية يبدأ بـ 11110xxx يتبعه ثلاثة بايتات استمرار يبدأ كل منها بـ 10xxxxxx — أي 32 بتًا إجمالًا لرمز تعبيري واحد.

ماذا يحدث إذا كان إدخالي الثنائي يحتوي على مجموعات غير صالحة؟

يجب أن تتكوّن كل مجموعة من 8 أحرف بالضبط من 0 و1، مفصولة بمسافات. تُتجاهَل المجموعات غير الصالحة أو غير المكتملة — وكذلك بايتات الاستمرار التي لا تتطابق مع بايت بداية صالح — بدلاً من تعطيل عملية التحويل.

هل تعمل هذه الأداة مع ترميزات أخرى غير UTF-8؟

لا، وهي لا تدّعي ذلك. يُخصّص UTF-16 والترميزات القديمة أحادية البايت (مثل ISO-8859-9 للتركية) أعدادًا وأنماط بتات مختلفة لنفس الأحرف. لن يُفكّ الثنائي الناتج عن هذه الترميزات بشكل صحيح هنا — هذه الأداة هي تحديدًا محوّل نص إلى ثنائي بترميز UTF-8.

التعليقات

لا توجد تعليقات بعد — كن أول من يكتب تعليقًا!

أدوات مشابهة