موقف من الحياة اليومية#

صاحبك بعتلك ملف فيه أسماء الطلبة، فتحته لقيت الكلام شكله كده:

عربي

بدل كلمة «عربي»!

أول حاجة هتيجي في بالك: «الملف باظ». لكن الحقيقة إن الملف سليم تمامًا، وكل البيانات اللي فيه موجودة. المشكلة إن البرنامج اللي فتحت بيه الملف قراه بلغة غلط. زي ما تدّي حد جواب مكتوب بالشفرة، وهو بيفكّه بمفتاح شفرة تانية.

في المقال ده هتفهم «الشفرة» دي: إزاي الكمبيوتر بيحوّل الحروف لأرقام، وليه العربي بالذات بيتلخبط أحيانًا.

خلاصة سريعة#

  • الكمبيوتر بيخزّن كل حرف على شكل رقم، والاتفاق اللي بيحدد رقم كل حرف اسمه ترميز الحروف (Character Encoding · ترميز الحروفالطريقة المتفق عليها لتحويل الحروف والرموز إلى أرقام وبايتات يخزّنها الحاسوب، ثم إعادتها حروفًا عند العرض. وإذا قُرئت البيانات بترميز غير الذي حُفظت به ظهرت رموز غير مفهومة.عرض في القاموس).
  • Unicode · يونيكودمعيار عالمي يعطي كل حرف أو رمز في لغات العالم رقمًا ثابتًا خاصًا به، ويُكتب الرقم بالنظام السداسي عشر بعد U+، مثل U+0627 لحرف الألف.عرض في القاموس جدول عالمي بيدّي كل حرف في كل لغات العالم رقم ثابت، و**UTF-8 · يو تي إف 8طريقة لتحويل أرقام Unicode إلى بايتات، يأخذ فيها الحرف من 1 إلى 4 بايتات، فالحرف الإنجليزي بايت واحد والحرف العربي بايتان. وهي الترميز الموصى به على الويب.عرض في القاموس** هي الطريقة الأشهر لتخزين الأرقام دي، وفيها الحرف العربي بياخد 2 بايت.
  • الرموز الغريبة اللي زي عربي بتظهر لما بيانات محفوظة بترميز تتقري بترميز تاني. البيانات سليمة، بس اتقرت غلط.

ببساطة#

تخيّل إن عندك قاموس شفرة: كل حرف قصاده رقم. إنت بتكتب رسالة وتحوّلها لأرقام بالقاموس ده، وصاحبك بيرجّعها حروف بنفس القاموس.

طول ما إنتوا الاتنين معاكم نفس القاموس، الرسالة بتوصل سليمة. لكن لو صاحبك استخدم قاموس تاني، هيطلّع حروف غلط، مع إن الأرقام نفسها ما اتغيرتش.

وده بالظبط اللي بيحصل في الكمبيوتر: «القاموس» اسمه الترميز، والقاموس العالمي اللي معظم الأجهزة والمواقع بتستخدمه النهارده هو Unicode مع UTF-8.

حرف الألف ليه رقم في Unicode، والرقم ده بيتخزن في UTF-8 على شكل بايتين. ولو البايتين اتقروا بترميز تاني، بيظهروا رموز لاتينية غريبة.

بالتفصيل#

الكمبيوتر بيفهم أرقام بس#

فاكر من مقال النظام الثنائي إن الكمبيوتر بيخزّن كل حاجة على شكل 0 و1؟ يعني ما ينفعش يخزّن حرف «ب» زي ما هو. لازم الأول نتفق إن «ب» = رقم معيّن، وبعدين الرقم ده يتخزن بالثنائي.

الاتفاق ده اسمه ترميز الحروف. وحسب W3C (الجهة اللي بتحط معايير الويب)، الترميز هو الطريقة اللي بتحوّل بيها الحروف لبايتات علشان الكمبيوتر يتعامل معاها.

ASCII: البداية (من غير عربي)#

من أقدم الاتفاقات وأشهرها ASCII · آسكيترميز قديم للحروف يستخدم 7 بتات، ويضم 128 رمزًا فقط هي الحروف الإنجليزية والأرقام وعلامات الترقيم وبعض رموز التحكم، ولا يحتوي على حروف عربية.عرض في القاموس. والمعيار RFC 20 اعتمده سنة 1969 لتبادل البيانات بين الأجهزة.

حسب RFC 20، ASCII بيستخدم 7 بت بس لكل حرف. ولأن 2^7 = 128، يبقى فيه 128 رمز بس: الحروف الإنجليزية الكبيرة والصغيرة، والأرقام، وعلامات الترقيم، وشوية رموز تحكم.

مثلًا، حسب مقرر CS50، حرف A رقمه 65 في ASCII.

المشكلة: 128 رمز بالكتير يكفوا الإنجليزي، لكن مافيهمش ولا حرف عربي، ولا صيني، ولا أي لغة تانية. علشان كده كل منطقة في العالم عملت ترميز خاص بيها لفترة طويلة، ومن هنا بدأت اللخبطة: نفس الرقم معناه حرف في ترميز، وحرف تاني خالص في ترميز تاني.

Unicode: جدول واحد لكل اللغات#

الحل كان Unicode: جدول عالمي واحد، كل حرف في كل لغة فيه ليه رقم ثابت مش بيتغير. الرقم ده اسمه نقطة الترميز (Code Point · نقطة الترميزالرقم الذي يعطيه معيار Unicode لحرف أو رمز معيّن، ويُكتب بالشكل U+ متبوعًا برقم سداسي عشر.عرض في القاموس)، وبيتكتب بـ U+ وبعدها رقم بالنظام السداسي عشر.

ودي أمثلة من جدول الحروف العربية الرسمي في Unicode:

الحرفرقمه في Unicode
ا (ألف)U+0627
ب (باء)U+0628
ل (لام)U+0644
ء (همزة)U+0621

والحروف العربية الأساسية موجودة في منطقة من الجدول من U+0600 لـ U+06FF.

وحسب الإعلان الرسمي، آخر إصدار هو Unicode 18.0 اللي اتنشر في 16 سبتمبر 2026، وفيه 172,808 رمز. والرقم ده بيزيد مع كل إصدار جديد.

UTF-8: إزاي الأرقام بتتحول لبايتات#

UTF-8 هي الطريقة الأشهر لتخزين أرقام Unicode. وفكرتها الذكية إن الحرف مش لازم ياخد نفس عدد البايتات. حسب المعيار RFC 3629، الحرف بياخد من 1 لـ 4 بايت حسب رقمه:

نوع الحرفمثالعدد البايتاتالبايتات
حرف إنجليزيA141
حرف عربيا2D8 A7
إيموجي😀4F0 9F 98 80

جرّبنا الأمثلة دي فعليًا على الكمبيوتر وطلعت نفس البايتات.

ولاحظ حاجة مهمة: حرف A في UTF-8 = 41 بالسداسي، يعني 65، نفس رقمه في ASCII بالظبط. حسب RFC 3629، الحروف الـ 128 بتوع ASCII بتتخزن في UTF-8 زي ما هي. علشان كده أي ملف ASCII قديم هو أصلًا ملف UTF-8 سليم.

وده معناه إيه بالنسبالك؟ كلمة عربية من 4 حروف زي «عربي» بتاخد 8 بايت، والكلمة الإنجليزية من 4 حروف زي «word» بتاخد 4 بايت بس.

UTF-8 هو المعيار على الويب#

  • W3C بتنصح كل اللي بيعملوا مواقع إنهم يستخدموا UTF-8، وإن برامج الكتابة تستخدمه تلقائيًا في أي ملف جديد.
  • ومعيار الترميز من WHATWG (اللي المتصفحات بتتبعه) بيقول إن UTF-8 هو الترميز المناسب لتبادل النصوص، وبيطلبه في أي صيغ أو بروتوكولات جديدة.

وموقعنا ده نفسه مكتوب بـ UTF-8.

ليه العربي بيظهر رموز غريبة؟#

دلوقتي نقدر نحل لغز الموقف اللي في أول المقال:

  1. الكلمة اتحفظت بـ UTF-8. كلمة «ال» مثلًا اتخزنت كـ 4 بايتات: D8 A7 D9 84.
  2. البرنامج اللي فتح الملف افتكر إنه ترميز تاني. مثلًا ترميز غربي قديم اسمه Windows-1252، وده كل حرف فيه بايت واحد بس.
  3. كل بايت اتقرا على إنه حرف لوحده: D8 بقت Ø، وA7 بقت §، وD9 بقت Ù، و84 بقت „.

النتيجة: «ال» بتظهر ال. جرّبنا ده فعليًا على Linux وطلعت نفس الرموز بالظبط.

علشان كده لو شفت كلام عربي ظاهر رموز غريبة كتير فيها Ø وÙ، غالبًا ده نص UTF-8 بيتقري بترميز غربي قديم. البيانات نفسها سليمة، والحل إن البرنامج يقراها بالترميز الصح.

حاجات مميزة في العربي#

حسب الفصل الخاص بالعربي في معيار Unicode:

1. العربي بيتكتب من اليمين للشمال، والحروف متصلة. والحرف الواحد شكله بيتغير حسب مكانه: لوحده، أو في أول الكلمة، أو في نصها، أو في آخرها. خد حرف الهاء مثلًا: «ه» لوحدها، و«هـ» في الأول، و«ـهـ» في النص، و«ـه» في الآخر.

2. لكن Unicode بيدّي الحرف رقم واحد بس، مهما اختلفت أشكاله. والخط اللي على الشاشة هو اللي بيختار الشكل المناسب وقت العرض. يعني الهاء في كل أشكالها متخزنة بنفس الرقم.

3. التشكيل رموز منفصلة. الفتحة والضمة والكسرة والسكون وغيرهم ليهم أرقام خاصة بيهم في Unicode، من U+064B لـ U+0652، وبيتخزنوا بعد الحرف كرموز مستقلة. علشان كده «كَتَبَ» و«كتب» مختلفين في البايتات، مع إن الحروف واحدة. وده السبب إن البحث في موقعنا معمول بحيث يتجاهل التشكيل، علشان تلاقي الكلمة سواء كتبتها مشكّلة أو لأ.

للمتعمقين

جدول UTF-8 الكامل

حسب RFC 3629 (اللي اتنشر سنة 2003 كمعيار رسمي رقم STD 63):

أرقام Unicodeعدد البايتات
من U+0000 لـ U+007F (حروف ASCII)1
من U+0080 لـ U+07FF (ومنها الحروف العربية الأساسية)2
من U+0800 لـ U+FFFF3
من U+10000 لـ U+10FFFF (زي الإيموجي 😀 ورقمه U+1F600)4

وأكبر رقم ممكن في Unicode هو U+10FFFF، يعني حوالي مليون و114 ألف مكان. حسب الأسئلة الشائعة في Unicode، المدى الصالح من U+0000 لـ U+10FFFF.

UTF-8 مش الطريقة الوحيدة

حسب Unicode، فيه طرق تانية لتخزين نفس الأرقام، زي UTF-16 وUTF-32. الثلاثة بيخزّنوا نفس جدول Unicode، بس بعدد بايتات مختلف لكل حرف. لكن على الويب، UTF-8 هو المعيار زي ما شرحنا.

الأرقام اللي بيسموها «عربية»

معيار Unicode بيذكر 3 مجموعات أرقام مرتبطة بالعربي: الأرقام 0-9 اللي بنستخدمها في الموقع ده، ومعيار Unicode بيسميها European digits. ومجموعة تانية بتُستخدم في بعض البلاد العربية، ومكانها في Unicode من U+0660 لـ U+0669، وبيسميها Arabic-Indic digits. ومجموعة تالتة بيسميها Eastern Arabic-Indic digits. وبيقول المعيار إن الأسماء التقليدية للأرقام دي ما ينفعش تتستخدم من غير لخبطة، علشان كده سماها بالأسماء دي.

ليه الكلام الإنجليزي بيتلخبط جوه الجملة العربية؟

لما تكتب كلمة إنجليزية أو رقم جوه جملة عربية، الكمبيوتر محتاج يعرف يعرض كل جزء في أنهي اتجاه. وUnicode عنده خوارزمية كاملة لده اسمها خوارزمية الاتجاهين (Bidirectional Algorithm). ولما المعلومات اللي حوالين الكلمة مش كفاية، ممكن الترتيب يطلع غلط، زي إن «16 GB» تظهر «GB 16». وفي موقعنا بنستخدم عناصر خاصة في HTML علشان نتجنب المشكلة دي.

جرّب بنفسك على Linux

الأمر ده بيعرض البايتات اللي حرف الألف بيتخزن بيها في UTF-8 (بالسداسي عشر):

نافذة الطرفية
printf 'ا' | od -An -tx1
الناتج المتوقع
 d8 a7

والأمر ده بيعمل «الكلام المتلخبط» بنفسك: بياخد كلمة «ال» المحفوظة بـ UTF-8، ويقراها على إنها Windows-1252:

نافذة الطرفية
printf 'ال' | iconv -f windows-1252 -t utf-8
الناتج المتوقع
ال

جرّبنا الأمرين فعليًا على Fedora Linux. الأمر od جزء من GNU Coreutils، وiconv جزء من مكتبة glibc، والاتنين موجودين في توزيعات Linux المعتادة.

أخطاء شائعة#

  • «الملف اللي ظاهر فيه رموز غريبة بايظ»: غالبًا لأ. البيانات سليمة، بس البرنامج بيقراها بترميز غير اللي اتحفظت بيه.
  • «Unicode وUTF-8 حاجة واحدة»: غلط. Unicode جدول بيدّي كل حرف رقم، وUTF-8 طريقة لتخزين الرقم ده كبايتات.
  • «كل حرف = بايت واحد»: ده كان صح في ASCII بس. في UTF-8 الحرف العربي بياخد 2 بايت، والإيموجي 4.
  • «الحرف العربي ليه 4 أرقام مختلفة علشان ليه 4 أشكال»: غلط. الحرف ليه رقم واحد في Unicode، والخط هو اللي بيختار الشكل.
  • «التشكيل جزء من الحرف»: غلط. كل علامة تشكيل رمز منفصل ليه رقمه الخاص.

المصطلحات#

  • ترميز الحروف (Character Encoding · ترميز الحروفالطريقة المتفق عليها لتحويل الحروف والرموز إلى أرقام وبايتات يخزّنها الحاسوب، ثم إعادتها حروفًا عند العرض. وإذا قُرئت البيانات بترميز غير الذي حُفظت به ظهرت رموز غير مفهومة.عرض في القاموس): الطريقة المتفق عليها لتحويل الحروف إلى أرقام وبايتات، ثم إعادتها حروفًا عند العرض.
  • آسكي (ASCII · آسكيترميز قديم للحروف يستخدم 7 بتات، ويضم 128 رمزًا فقط هي الحروف الإنجليزية والأرقام وعلامات الترقيم وبعض رموز التحكم، ولا يحتوي على حروف عربية.عرض في القاموس): ترميز قديم يستخدم 7 بتات ويضم 128 رمزًا، وليس فيه حروف عربية.
  • يونيكود (Unicode · يونيكودمعيار عالمي يعطي كل حرف أو رمز في لغات العالم رقمًا ثابتًا خاصًا به، ويُكتب الرقم بالنظام السداسي عشر بعد U+، مثل U+0627 لحرف الألف.عرض في القاموس): معيار عالمي يعطي كل حرف في لغات العالم رقمًا ثابتًا.
  • نقطة الترميز (Code Point · نقطة الترميزالرقم الذي يعطيه معيار Unicode لحرف أو رمز معيّن، ويُكتب بالشكل U+ متبوعًا برقم سداسي عشر.عرض في القاموس): الرقم الذي يعطيه Unicode لحرف معيّن، ويُكتب بالشكل U+ ثم رقم سداسي عشر.
  • UTF-8 (UTF-8 · يو تي إف 8طريقة لتحويل أرقام Unicode إلى بايتات، يأخذ فيها الحرف من 1 إلى 4 بايتات، فالحرف الإنجليزي بايت واحد والحرف العربي بايتان. وهي الترميز الموصى به على الويب.عرض في القاموس): طريقة لتخزين أرقام Unicode، يأخذ فيها الحرف من 1 إلى 4 بايتات، وهي الترميز الموصى به على الويب.

اختبر نفسك#

كلمة «سلام» بتاخد كام بايت في UTF-8؟

إظهار الإجابة

8 بايت. الكلمة فيها 4 حروف عربية، وكل حرف عربي أساسي بياخد 2 بايت في UTF-8. يعني 4 × 2 = 8.

فتحت ملف لقيت العربي فيه ظاهر رموز لاتينية غريبة كتير فيها حرف Ø. إيه السبب غالبًا؟

إظهار الإجابة

الملف محفوظ بـ UTF-8، لكن البرنامج بيقراه بترميز غربي قديم (زي Windows-1252). البيانات سليمة، والحل إن الملف يتفتح بترميز UTF-8.

حرف A رقمه كام في ASCII؟ وبياخد كام بايت في UTF-8؟

إظهار الإجابة

رقمه 65، وبياخد بايت واحد. حروف ASCII بتتخزن في UTF-8 زي ما هي بالظبط، وده اللي بيخلي UTF-8 متوافق مع ASCII.