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

ترجم النص إلى ثنائي — بايتاته في UTF-8، ثمانية أرقام لكل بايت — والثنائي إلى نص من جديد، مع السطر والعمود لأي حرف دخيل.

الإدخال
الإخراج
11011001 10000101 11011000 10110001 11011000 10101101 11011000 10101000 11011000 10100111

كيف يصير النص آحادًا وأصفارًا

يحفظ الحاسوب النص على هيئة بايتات، والبايت ثمانية بتات، كل واحد منها 0 أو 1. وهذه الصفحة تُريك تلك البايتات: اكتب نصًا فيخرج كل بايت ثمانيةَ أرقام ثنائية، وبين البايت والذي يليه مسافة، أو الصق أرقامًا ثنائية واقرأ النص الذي تؤلّفه. وهي تعمل في الاتجاهين، وتجري بالكامل في متصفحك، وتُفتح على مثال محوَّل سلفًا.

أيُّ البايتات يتألف منها النص أمرٌ يتوقف على ترميزه، وهو هنا UTF-8 ما لم تختر غيره، لأن UTF-8 هو ما تحمله صفحات الويب وعناوين URL ومعظم الملفات النصية. ومُحدِّد «الوحدة» يقرّر ما تمثّله مجموعة واحدة من الأرقام: بايتًا من UTF-8، أو بايتًا من UTF-16 بأيٍّ من ترتيبَي البايتات، أو نقطة ترميز واحدة. والوحدة التي تختارها تسري في الاتجاهين، ولا تغيّرها الصفحة نيابةً عنك أبدًا. وحين يبدو ما تلصقه وحدةً أخرى، تقول الصفحة ذلك وتضع زرًا بجانب التنبيه، ولا يتبدّل شيء حتى تضغطه.

لماذا يُكتب كل بايت بثمانية أرقام

البت رقم ثنائي واحد، والبايت ثمانية منها. ويمكن لثمانية بتات أن تتخذ 256 حالة، فيحمل البايت عددًا صحيحًا من 0، أي 00000000، إلى 255، أي 11111111. وبالبايت تُقاس الملفات والذاكرة وما تنقله الشبكات، وهو في أي آلة يُرجَّح أن تصادفها ثمانية بتات؛ وتسميه معايير الشبكات «ثمانية»، وهي كلمة لا يمكن أن تعني إلا ثمانية.

وأول 128 قيمة من تلك القيم هي ASCII، أي ترميز الحروف الإنجليزية والأرقام وعلامات الترقيم الشائعة، و128 قيمة لا تحتاج إلا إلى سبعة بتات. لذلك يبدأ بايت كل محرف من ASCII بالرقم 0، ويحتفظ UTF-8 بالبايتات التي تبدأ بالرقم 1 لكل ما ليس في ASCII. والصفحة تكتب كل بايت بأرقامه الثمانية كلها، والأصفار البادئة معها، لسبب عملي أيضًا: فالبايتات ذات العرض الثابت الواحد يمكن قراءتها من جديد دون مسافات بينها، ثمانية أرقام في كل مرة.

الحرف H، بتًا بتًا

خذ الحرف الكبير H. يعطيه ASCII الرقم 72، و72 مكتوبًا في بايت هو 01001000. وإذا قرأته من اليسار كانت قيم مواضعه الثمانية 128 و64 و32 و16 و8 و4 و2 و1، وكل 1 يُحتسب بقيمة موضعه: ففي هذا البايت يقع الرقم 1 في الموضعين اللذين قيمتاهما 64 و8، و64 و8 مجموعهما 72. والحرف الصغير i هو 105، أي 64 و32 و8 و1، فيخرج Hi على هيئة ‎01001000 01101001.

حالة الأحرف بت واحد. فالحرف الصغير h هو 01101000، أي بايت H وقد ضُبط فيه الموضع الذي قيمته 32، والأمر نفسه يصدق على كل حرف من الأبجدية الإنجليزية، لأن ASCII يعطي كل حرف صغير رقمًا أكبر بمقدار 32 بالضبط من رقم حرفه الكبير.

ومُحدِّد «الأساس» يكتب البايت نفسه بطرق أخرى دون أن يغيّره. فإذا اخترت «عشري» كان H هو 72، وإذا اخترت «ست عشري» كان 48، وإذا اخترت «ثماني» كان 110. إنه بايت واحد مكتوب بأربع طرق، والقراءة تستعيد الأرقام بأي أساس اخترته. ومحوّل النص إلى ست عشري يُفتح على «ست عشري»، حيث يأخذ البايت رقمين لا ثمانية.

لماذا يأخذ الحرف الذي بعد ASCII بايتين أو أكثر

ينتهي ASCII عند 127. أما الحرف ذو العلامة، والحرف من الأبجدية السيريلية أو العبرية أو العربية، والمحرف الياباني أو الكوري، والرمز التعبيري، فلكل منها نقطة ترميز تقع بعده، وUTF-8 لا يكتب المحرف في بايت واحد إلا إذا كان من ASCII، محتفظًا بالبايتات التي تبدأ بالرقم 1 لكل ما عداه. لذلك يأخذ كل واحد منها بايتين أو ثلاثة أو أربعة، والثنائي هو حيث تستطيع أن ترى ذلك يحدث، لأن البتات الأولى من كل بايت تقول أي جزء من المحرف هو ذلك البايت:

  • 0xxxxxxx محرف في بايت واحد: ASCII، وبتاته السبعة مكتوبة مكان حروف x. فالحرف H هو 01001000.
  • 110xxxxx 10xxxxxx محرف في بايتين، لنقاط الترميز حتى 2,047، وهذا يشمل الحروف ذات العلامات في اللغات الأوروبية والأبجديات السيريلية والعبرية والعربية. فالحرف é هو ‎11000011 10101001، والحرف א هو ‎11010111 10010000.
  • 1110xxxx 10xxxxxx 10xxxxxx ثلاثة بايتات، لنقاط الترميز حتى 65,535، وهناك تقع الكانا اليابانية ومحارف الكانجي الشائعة والهانغول الكوري ورمز اليورو. فالرمز € هو ‎11100010 10000010 10101100.
  • 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx أربعة بايتات، لكل نقطة ترميز بعد ذلك، وهناك تقع معظم الرموز التعبيرية.

والبايت الأول الذي يبدأ باثنين أو ثلاثة أو أربعة من الرقم 1 يقول كم بايتًا لمحرفه، وكل بايت يُكمل المحرف يبدأ بالرقمين 10، فلا يمكن أن يُظن بايت من وسط محرف بدايةً لمحرف. انزع من بايتَي א البادئتين، 110 و10، فتكون البتات الأحد عشر الباقية، 10111010000، هي نقطة ترميزه، U+05D0، مكتوبة بالثنائي. وإذا اخترت «ست عشري» قُرئ البايتان نفسهما D7 90، ويكون القالب مطويًا داخل الأرقام؛ أما في الثنائي فهو قائم في البتات الأولى من كل بايت.

أربعة بايتات لرمز تعبيري واحد

الرمز 😀 هو U+1F600، أي أبعد كثيرًا من 65,535، فيكتبه UTF-8 في أربعة بايتات: ‎11110000 10011111 10011000 10000000. يبدأ أولها بأربعة من الرقم 1، فهو يفتتح محرفًا من أربعة بايتات، وكل واحد من الثلاثة التي تليه يبدأ بالرقمين 10. ونقطة ترميزه تأخذ سبعة عشر رقمًا ثنائيًا، 11111011000000000، أي رقمًا واحدًا أكثر من الستة عشر التي يتسع لها المحرف ذو البايتات الثلاثة؛ أما قالب البايتات الأربعة فيتسع لواحد وعشرين.

والرمز التعبيري الذي يبدو رمزًا واحدًا قد يكون عدة نقاط ترميز، وكل واحدة منها تُكتب كاملة. فاليد الملوِّحة بلون بشرة نقطتا ترميز وثمانية بايتات. والعائلة المؤلفة من أربعة أفراد سبع نقاط ترميز، أي أربعة أشخاص والروابط الخفية الثلاثة بينهم، وخمسة وعشرون بايتًا. الصق واحدًا منها في الصفحة وعُدّ المجموعات.

لماذا يطبع محوّل آخر أحد عشر رقمًا للحرف א

المحوّل الذي يطبع أحد عشر رقمًا للحرف א، أي 10111010000، لم يكتب بايتات ذلك الحرف. لقد كتب العدد الذي يعطيه يونيكود لهذا الحرف، نقطة ترميزه U+05D0، وهي 1488، عددًا ثنائيًا واحدًا، وهذا العدد ليس بايتًا من أي شيء يحمله ملف أو شبكة. والرسالة المكتوبة بهذه الطريقة لا تقرؤها من جديد إلا أداة تفترض الافتراض نفسه.

والجوابان أقرب مما يبدوان. فالأرقام الأحد عشر هي بالضبط البتات التي يوزّعها UTF-8 على بايتيه بعد نزع البادئات، كما هو مبيّن أعلاه، فكلا المحوّلين يكتب العدد نفسه، وأحدهما فقط يكتب البايتات التي تخزّنه. وفي محرف من ASCII يتفق الاثنان إلا في الأصفار البادئة، ولهذا يعطيان الجواب نفسه للإنجليزية البسيطة ويفترقان في كل ما عداها تقريبًا.

وهذه الصفحة تعطي ذلك الجواب أيضًا، وحدةً تختارها أنت لا افتراضًا تفترضه هي: اختر «نقاط الترميز» فيُكتب א على هيئة 10111010000، ويُقرأ من جديد بالطريقة نفسها. وإذا ألصقت، وUTF-8 مختار، رسالةً كتبها محوّل نقاط ترميز بالعبرية أو الروسية أو اليابانية، كانت المجموعات أعرض من البايت؛ والصفحة لا تخمّن، بل تقول إن المجموعات تبدو نقاط ترميز وتعرض الزر «التبديل إلى نقاط الترميز». والمحوّل الذي يعمل على وحدة ترميز واحدة من UTF-16 في كل مرة، كما تفعل charCodeAt في JavaScript، يكتب 😀 عددين من ستة عشر رقمًا لكل منهما، هما نصفا الزوج البديل الذي يخزّنه UTF-16 على هيئته، والوحدة «نقاط الترميز» تقرأ الزوج من جديد على أنه الرمز التعبيري الواحد.

قراءة الثنائي نصًا من جديد

لتحويل الثنائي إلى نص من جديد، بدّل الاتجاه إلى «ثنائي إلى نص» واكتب الأرقام أو الصقها، فيكون الإخراج هو النص الذي تؤلّفه. والزر «استخدمه كإدخال» يفعل ذلك بنقرة واحدة، إذ ينقل الإخراج إلى الإدخال ويقلب الاتجاه، وهي أسرع طريقة للتحقق من رحلة الذهاب والإياب. وكل ما يلي يُقرأ على أنه البايتات نفسها:

  • المسافات البيضاء من أي نوع، ومنها فواصل الأسطر، والفاصلة أو الفاصلة المنقوطة أو النقطتان أو الشرطة بين البايتات.
  • انعدام الفواصل تمامًا، حيثما انقسمت الأرقام إلى بايتات كاملة من ثمانية، وهكذا يكتبها الخيار «متصل» في «النمط».
  • مجموعات من سبعة أرقام أو أقل، وهكذا يبدو محرف ASCII حين يسقط صفره البادئ: إذ تُقرأ ‎1001000 1101001 على أنها Hi.
  • 0b قبل البايت، بحرف كبير أو صغير، وزوج واحد من الأقواس المربعة أو المتعرجة أو الهلالية، أو من علامات الاقتباس، حول الكل.

لكن الصفحة لا تخمّن. فأي محرف آخر، أو أي مجموعة أطول من ثمانية أرقام لا تنقسم إلى بايتات كاملة، يوقف القراءة، وتقول الصفحة ذلك مع السطر والعمود حيث يقع، ويُعرض سطرك أنت تحته والموضع معلَّم فيه. وفي رسالة طويلة هذا هو الفرق بين خطأ كتابي تستطيع أن تجده ونص خاطئ في صمت.

والثنائي الذي يُقرأ بايتات بلا عناء لكنه ليس نصًا في UTF-8 يُعرض ولا يُرفض. فالرسالة المقطوعة في وسط محرف تعود والتسلسل المكسور معروض على هيئة U+FFFD، أي حرف الاستبدال، ويقول تنبيه تحت الإخراج كم تسلسلًا كهذا هناك وأين يبدأ أولها: البايت، والأرقام التي ألصقتها له، والسطر والعمود اللذان تقع فيهما.

الثنائي للنص، والثنائي للعدد

اكتب 5 هنا فيكون الجواب 00110101 لا 101. فالصفحة تكتب المحرف 5، الذي يعطيه ASCII الرقم 53، لأن أرقام النص هي البايتات التي تخزّنه؛ أما 101 فهو العدد خمسة مكتوبًا بالثنائي، وهذا سؤال آخر جوابه آخر. والأمر نفسه مع 255: فإذا كُتب هنا كان ثلاثة محارف وثلاثة بايتات، بينما العدد 255 بايت واحد هو 11111111.

وحين يكون ما بين يديك عددًا لا نصًا، كحصيلة عدّ أو محتوى سجل في المعالج أو قيمة طبعها برنامج، فمكانه محوّل أنظمة العد: فهو يحوّل القيمة نفسها بين الثنائي والثماني والعشري والست عشري وأسس أخرى، وبعرض ثابت يكتب القيمة السالبة بالمتمّم الثنائي ويعرض كل بت بتًا يمكنك النقر عليه لقلبه. هذه الصفحة تبدأ من محارف النص؛ وتلك تبدأ من عدد.

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

كيف أكتب اسمي بالثنائي؟
اكتبه في حقل الإدخال فيخرج بايتًا بعد بايت، ثمانية أرقام لكل بايت ومسافة بين البايتات. فالاسم Ada مثلًا هو ‎01000001 01100100 01100001. والحرف ذو العلامة، أو الحرف من أبجدية أخرى، يأخذ بايتين أو أكثر، والمسافة بين اسمين بايت قائم بذاته، 00100000.
كم بتًا يأخذ المحرف الواحد؟
في UTF-8: ثمانية لحرف أو رقم أو علامة ترقيم من ASCII، وستة عشر للحرف ذي العلامة أو للحرف السيريلي أو العبري أو العربي، وأربعة وعشرون للكانا اليابانية ومحارف الكانجي الشائعة والهانغول الكوري ورمز اليورو، واثنان وثلاثون لمعظم الرموز التعبيرية. وما تراه رمزًا واحدًا قد يكون في باطنه عدة نقاط ترميز، ولكل واحدة منها بتاتها.
هل أستطيع لصق الثنائي بلا مسافات بين البايتات؟
نعم، حيثما انقسمت الأرقام إلى بايتات كاملة: فستة عشر رقمًا بايتان، وأربعة وعشرون ثلاثة. أما المجموعة الأطول من ثمانية أرقام التي ليس طولها من مضاعفات الثمانية فلا يمكن تقسيمها دون تخمين أي بايت فقد رقمًا، ولذلك تُرفض عند سطرها وعمودها بدل أن تُقرأ قراءة خاطئة.
لماذا يعود نصي وفيه علامة استفهام داخل معيَّن؟
ذلك الرمز هو U+FFFD، أي حرف الاستبدال، وتضعه الصفحة حيثما لم تكن البايتات نصًا في UTF-8: وفي أغلب الأحيان يكون بايت قد ضاع فانقطع محرف، أو تكون البايتات لم تكن UTF-8 أصلًا. وبدل أن ترفض الصفحة الرسالة كلها، تعرض كل تسلسل مكسور بهذه الطريقة وتقول تحت الإخراج كم تسلسلًا هناك وأين يبدأ أولها، لتجد الضرر فيما ألصقته.
لماذا يعطيني محوّل آخر ثنائيًا مختلفًا؟
على الأرجح أنه يكتب نقطة ترميز كل محرف لا بايتاته. والمحوّلان يتفقان في ASCII إلا في الأصفار البادئة، ويفترقان بعده: فالحرف א هو ‎11010111 10010000 هنا و10111010000 هناك. اختر «نقاط الترميز» لتحصل على جواب ذلك المحوّل، أو لتقرأ من جديد رسالة كتبها.
لماذا لا يكون 5 هو 101 هنا؟
لأن الرقم 5 المكتوب في الحقل محرف، والصفحة تكتب البايت الذي يخزّنه، 00110101. أما العدد خمسة فهو 101 بالثنائي؛ ولعدد لا لنص، استخدم محوّل أنظمة العد.
هل يُرسَل نصي إلى خادم؟
لا. يعمل الاتجاهان كلاهما بالكامل في متصفحك، فلا يغادر جهازك أبدًا النص الذي تكتبه ولا الثنائي الذي تلصقه.

أدوات ذات صلة

  • محوّل أنظمة العد

    إذا كتبت 5 في هذه الصفحة حصلت على البايت الذي يخزّن المحرف 5، أي 00110101. أما تلك الصفحة فهي للعدد لا للنص: تحوّل القيمة نفسها، فيُكتب العدد خمسة 101.

  • محوّل النص إلى ست عشري

    يكتب الست عشري البايت برقمين حيث يحتاج الثنائي إلى ثمانية، فالكلمة Hi هنا ‎01001000 01101001 وهناك ‎48 69، وهكذا يعرض التفريغ البايتات ويكتبها الكود. وهذه الصفحة تتيح الست عشري أيضًا، وتلك تُفتح عليه.

  • Base64

    يرمّز ويفكّ ترميز Base64 — بدعم UTF-8 كامل.

  • مُرمِّز / فاكّ ترميز العناوين

    ترميز نسبي لقيمة مفردة أو لعنوان كامل، والعكس.