> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/ar/mqalat-mtamqh/51-unicode-utf-8-and-multilingual-text-an-introduction.md).

# Unicode وUTF-8 والنص متعدد اللغات: مقدمة

## Unicode وOpenType: الأحرف والرموز الرسومية

لقد تطورت محركات TeX الحديثة، أي XeTeX وLuaTeX، من محرك TeX الأصلي لكنوث إلى حدٍّ كبير بسبب الحاجة إلى مواكبة التطورات في المشهد التقني، ولا سيما Unicode (للنص) وOpenType (لخطوط الطباعة). واليوم، من خلال استخدام حزم مثل [fontspec](https://ctan.org/pkg/fontspec?lang=en) و [unicode-math](https://ctan.org/pkg/unicode-math?lang=en)، يمكن لمستخدمي LaTeX الوصول إلى قدرات تركيب طباعي متقدمة للغاية توفرها خطوط OpenType — بما في ذلك التركيب الطباعي متعدد اللغات المتقدم والتركيب الطباعي الرياضي القائم على OpenType ([الذي ابتكرته Microsoft](https://blogs.msdn.microsoft.com/murrays)).

ومع ذلك، للحصول على أقصى استفادة من استخدام خطوط OpenType مع XeTeX/LuaTeX، قد يكون من المفيد الإلمام بعدد من الموضوعات/المفاهيم الخلفية — ولا سيما لاستكشاف المشكلات وإصلاحها أو لتمهيد الطريق لعمل أكثر تقدمًا/تعقيدًا. فعلى سبيل المثال، قد تقرأ أن محركي XeTeX وLuaTeX يستخدمان «مدخلات UTF-8» أو أنهما «مدركان لـUnicode»، وقد يتناول المزيد من القراءة عن خطوط OpenType موضوعات مثل «ترميز Unicode»، و«ميزات الخط» في OpenType، و«الرموز الرسومية»، و«معرّفات الرموز الرسومية»، و«أسماء الرموز الرسومية» وما إلى ذلك. هدفنا هو تقديم مقدمة لهذه المصطلحات/الموضوعات وتجميع إطار أساسي يوضح كيفية ترابطها، ونأمل أن يوفر دعمًا لمزيد من العمل أو حل المشكلات.

الموضوعات التي نهدف إلى تغطيتها تقع بشكل واضح إلى حدٍّ ما في مجالين رئيسيين: *يونيكود* والذي، في الواقع، يسكن عالم النص/الأحرف وترميز النص *OpenType* وعالمه هو عالم الخطوط والرموز الرسومية؛ لكن، بالطبع، فإن هذين العالمين مترابطان وهناك بعض التداخل، حتى في هذه المقالة الأولى.

### ما الموضوعات التي سنناقشها؟

التركيز الرئيسي لهذه المقالة هو بعض الموضوعات المتعلقة بـUnicode: بدءًا من مناقشة ما المقصود بـ«حرف»، ثم الانتقال إلى تقديم أنظمة الكتابة/اللغات، وترميز Unicode وUTF-8 — إلى جانب مثال على العمل مع ملفات نصية متعددة اللغات. وستبني مقالة لاحقة على هذا الجزء لتغطية موضوعات خلفية مرتبطة بتقنية خطوط OpenType. ومن الواضح أنه ضمن حدود منشور مدونة لا يمكن الشروع في «غوص عميق» في جميع المجالات التي نأمل مناقشتها: فهدفنا المعلن هو تقديم الإطار العام الذي يوضح كيف ترتبط بعض المفاهيم الأساسية وكيف تعمل معًا. وسنبدأ بالمفهوم الأكثر أساسية: وهو مفهوم الـ *الحرف*.

## الحرف: لبنة أساسية

فكرة/مفهوم أساسي يقع في صميم مناقشاتنا (وصميم Unicode) هو معنى «الحرف»: فهو أحد تلك الكلمات التي غالبًا ما يُفترض معناها من خلال استخدامها في العمل اليومي والمحادثات. ومع ذلك، من منظور Unicode، والتركيب الطباعي، وتقنيات الخطوط، نحتاج إلى شيء من الدقة أكثر وتعريف ما المقصود بـ«الحرف». فعلى سبيل المثال، قد يبدو لنا من الطبيعي جدًا أن نفكر في **a** و *a* بوصفهما «حرفين» مختلفين: «a غامق» و«a مائل». ولكن ليس كذلك: فهما مجرد تمثيلين بصريين مختلفين لنفس الحرف الأساسي، الذي يمنحه Unicode الاسم الرسمي [الحرف اللاتيني الصغير A](http://unicode.org/charts/PDF/U0000.pdf).

يونيكود [يعرّف حرفًا](http://www.unicode.org/glossary/#character) على أنه:

> «أصغر مكوّن في اللغة المكتوبة له قيمة دلالية؛ يشير إلى المعنى و/أو الشكل المجرد، بدلًا من شكل محدد...»

والذي يميز بوضوح بين *المظهر البصري* الخاصة بالحرف *ومعناه*.

يمكنك أن تفكر في الحرف بوصفه الوحدة الأساسية، أو اللبنة البنائية، للغة أو، بصورة أدق، لـ *كتابة*نظام كتابة *ومعناه* الجانب المجرد *الدور والغرض* لكل حرف بوصفه أحد مجموعة من اللبنات التي تُبنى منها في النهاية أنظمة الكتابة/اللغات.

### نظام الكتابة واللغة

يجدر بنا أن نذكر بإيجاز مفهومين مهمين: *أنظمة الكتابة* و *اللغتين*. ويوفّر موقع Unicode الإلكتروني [تعريفًا مفيدًا لنظام الكتابة](https://www.unicode.org/standard/supported.html):

> «يُشفِّر معيار Unicode أنظمة الكتابة وليس اللغات. وعندما تشترك أنظمة الكتابة لأكثر من لغة واحدة في مجموعات من الرموز الرسومية المرتبطة تاريخيًا بأصول مشتركة، فإن اتحاد كل تلك الرموز الرسومية يُعامل بوصفه مجموعة واحدة من الأحرف لأغراض الترميز ويُعرَّف بوصفه نظام كتابة واحدًا.»

باستخدام [مثال من ويكيبيديا](https://en.wikipedia.org/wiki/Script_\(Unicode\))، يتألف نظام الكتابة اللاتيني من [مجموعة من الأحرف](http://unicode.org/charts/) تُستخدم عبر لغات متعددة: الإنجليزية، الفرنسية، الألمانية، الإيطالية، وما إلى ذلك. وبالطبع، ليست كل الأحرف المعرّفة ضمن نظام الكتابة اللاتيني مستخدمةً من قبل جميع اللغات القائمة على هذا النظام — فمثلًا، الأبجدية الإنجليزية لا تحتوي على الأحرف ذات العلامات الصوتية الموجودة في لغات أوروبية أخرى مثل الفرنسية أو الألمانية.

### خطوط OpenType: أنظمة الكتابة واللغات

في هذه المرحلة سننتقل من Unicode إلى خطوط OpenType لأن مفهومي نظام الكتابة واللغة يلعبان أيضًا دورًا شديد الأهمية ضمن تقنية خطوط OpenType.

مجموعة من اللغات التي تستخدم نفس [كتابة](http://www.unicode.org/glossary/#script) قد تكون لكل منها تقاليد طباعية مختلفة عندما يتعلق الأمر بعرض النص المكتوب بلغة معينة. ومثال جيد على ذلك اللغة التركية و [سلوك حرف i غير المنقوط](https://en.wikipedia.org/wiki/Dotted_and_dotless_I) (انظر ملاحظات تلك الصفحة عن الترابطات). تُبنى «القواعد» الطباعية المتعلقة بأنظمة الكتابة/اللغات داخل وظائف خطوط OpenType من خلال ما يُسمى *الوسوم* بوسوم نظام الكتابة واللغة، [حزمة fontspec](https://ctan.org/pkg/fontspec?lang=en).

#### التطلّع داخل خط OpenType: أنظمة الكتابة/اللغات

لتوضيح ذلك أكثر، إليكم لقطة شاشة تُظهر خط [Scheherazade OpenType](http://software.sil.org/scheherazade/download/) الحرّ المفتوح (وأيضًا المجاني) [Microsoft VOLT](https://www.microsoft.com/en-us/Typography/volt.aspx) لتحرير الخطوط. في هذه الصورة يمكنك رؤية أنظمة الكتابة واللغات والميزات الطباعية المدمجة في Scheherazade — باستخدام VOLT يمكنك إضافة ميزات ووظائف إضافية إلى Scheherazade، لكن ذلك يتجاوز بكثير نطاق هذه المقالة!

![خط Scheherazade OpenType (بصيغة TrueType) مفتوح داخل Microsoft VOLT](/files/fb76b7196022331a9b14fafc32e7efa58d75293a)

من هذه اللقطة يمكنك أن ترى أن Scheherazade يدعم نظامي الكتابة العربية واللاتينية ويقدّم دعمًا متخصصًا إضافيًا لعدة لغات تستخدم الكتابة العربية — وذلك باستخدام ما يُسمّى بميزات OpenType، والمدرجة في المربع ذي الإطار الأخضر أعلاه. لن ندخل في تفاصيل هذه الميزات، لكن الرسالة هنا هي أن خطوط OpenType عالية الجودة تملك الكثير من الذكاء المدمج فيها، جاهزًا للاستخدام من قبل برامج التركيب الطباعي القادرة على الاستفادة من القواعد الطباعية المدمجة في الخطوط.

يمكن للقارئ المهتم أن يتصفح سجل وسوم OpenType لرؤية [وسوم أنظمة الكتابة](https://www.microsoft.com/typography/otspec/scripttags.htm) و [وسوم اللغات](https://www.microsoft.com/typography/developers/opentype/languagetags.aspx) المستخدمة حاليًا ضمن مواصفة OpenType.

### العودة إلى الأحرف: أدوار مختلفة للأحرف

مجموعة الأحرف التي تتكوّن منها العناصر الأساسية لنظام كتابة (أو لغة) لا تؤدي جميعها الدور نفسه. فمثلًا، في معظم اللغات توجد أحرف لـ *علامات الترقيم*، وأحرف لـ *الأرقام* إلى جانب الأحرف التي نفكر فيها بوصفها *حروفًا* في الأبجدية، والتي توجد لدى بعض أنظمة الكتابة أيضًا بصيغتيها الكبيرة والصغيرة. إن مفهوم الحرف واسع جدًا، ويشمل معيار Unicode أحرفًا متخصصة *لا يُقصد عرضها* لكن مهمتها «التحكم في تفسير النص أو عرضه». فعلى سبيل المثال، عند تركيب بعض النصوص العربية قد ترغب في فرض سلوك الوصل لبعض الأحرف أو منعه؛ ويوفر معيار Unicode أحرف تحكم خاصة للقيام بذلك: ما يُسمى [الواصل بعرض صفري](https://en.wikipedia.org/wiki/Zero-width_joiner) و [الغير واصل بعرض صفري](https://en.wikipedia.org/wiki/Zero-width_non-joiner). وهذه الأحرف ليست مخصصة للعرض، بل «تبتلعها» البرمجيات أثناء معالجة النص من أجل إنتاج تأثيراتها البصرية المقصودة.

تُخصّص لكل الأحرف المحددة ضمن معيار Unicode مجموعة من الخصائص التي تصف، في الواقع، دور وغرض كل حرف في ترميز Unicode — فالأسماء الرمزية، مثل LATIN SMALL LETTER A، ليست سوى عنصر واحد من قائمة خصائص الحرف. وتوصف هذه الخصائص بالكامل في [قاعدة بيانات محارف Unicode (UCD)](http://www.unicode.org/reports/tr44/) وتُستخدم على نطاق واسع في عمليات معالجة النصوص المحوسبة مثل البحث، والفرز، والتدقيق الإملائي، وما إلى ذلك. كما أن ملفات البيانات التي تسرد خصائص محارف Unicode [متاحة للتنزيل](http://www.unicode.org/Public/UCD/latest/).

ومن بين الخصائص المخصصة لكل حرف، فإن الأهم بالنسبة لمناقشتنا هو *معرّف رقمي* تُخصّصه له عملية ترميز Unicode، وهو موضوع سننتقل إليه الآن.

### الأحرف: الأرقام والترميزات

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

في مرحلة ما قد ترغب في نقل ذلك النص (تسلسلًا من الأرقام) عبر البريد الإلكتروني أو رسالة نصية أو عبر التواصل عبر الإنترنت مثل تغريدة أو منشور على نوع من وسائل التواصل الاجتماعي. ومن الواضح أن الجهاز الذي أنشأت عليه النص والجهاز/الأجهزة التي يستخدمها المستلم/المستلمون يجب أن يتفقا، بطريقة ما، على الأرقام التي تمثل أي الأحرف. وإلا فقد لا يُعرض نصك بشكل صحيح على جهاز المستلم.

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

## Unicode: البِتّات والبايتات لتخزين النص

Unicode معيار هائل يغطي أكثر بكثير من مجرد ترميز النص، لكننا هنا نركّز فقط على الترميز الذي يوفّره.

#### البِتّات والبايتات وكم عدد الأحرف؟

ذكرنا أن الأجهزة تخزن النص وتمثله على هيئة أرقام — وبالتحديد، ستُخزّن الأحرف بوصفها أعدادًا صحيحة: أعدادًا كاملة. ولتفهم تبعات ذلك بالنسبة لترميز Unicode، نحتاج إلى مراجعة *جدًا* وجيزة، *جدًا* أساسية، لكيفية تخزين الحواسيب للأعداد الصحيحة (ولسنا نعتزم الخوض في علم الحاسوب).

وباختصار شديد لقصة طويلة جدًا، فإن أجهزة اليوم المكتبية أو المحمولة تخزن الأعداد الصحيحة في «كتل» منفصلة قد يبلغ طولها 1 أو 2 أو 4 أو 8 بايتات. ويمكن لكل واحدة من هذه وحدات التخزين أن تخزن أعدادًا صحيحة حتى قيمة موجبة قصوى بناءً على العدد الإجمالي للبِتّات الموجودة في كل وحدة تخزين:

* 1 بايت (8 بِتات): القيمة الصحيحة الموجبة القصوى هي 255؛
* 2 بايت (16 بِت): القيمة الصحيحة الموجبة القصوى هي 65535؛
* 4 بايت (32 بِت): القيمة الصحيحة الموجبة القصوى هي 4,294,967,295؛
* 8 بايت (64 بِت): القيمة الصحيحة الموجبة القصوى هي 18,446,744,073,709,551,615.

عمليًا، يستخدم معيار Unicode أرقامًا في المجال من 0 إلى 1,114,111 لترميز جميع أحرف العالم، والنتيجة أنه يحتاج إلى 21 بِتًّا فقط لترميز النطاق الكامل. ويمكننا أن نرى ذلك بملاحظة أن وحدات التخزين التي تحتوي على n بِتات يمكنها تمثيل أي عدد صحيح موجب من 0 حتى القيمة القصوى $$2^n -1$$؛ وبالتالي:

* القيمة القصوى التي يمكن تخزينها في 20 بِتًا هي $$2^{20} -1 = 1,048,575$$  (صغيرة جدًا)؛
* القيمة القصوى التي يمكن تخزينها في 21 بِتًا هي $$2^{21} -1 = 2,097,151$$  (كبيرة بما يكفي).

لقد أشرنا إلى أن الحواسيب تخزن البيانات (الأرقام) في وحدات من 1 أو 2 أو 4 (أو 8) بايتات، فإلى أي مدى يجب أن تكون وحدة التخزين كبيرة إذا كان علينا تخزين قيم تصل إلى القيمة القصوى لـUnicode وهي 1,114,111؟ من الواضح أن وحدة تخزين بحجم بايت واحد يمكنها احتواء قيمة قصوى تبلغ 255، وأن 2 بايت يمكنها تخزين 65535: ولا يكفي أي منهما لتخزين النطاق الكامل من الأحرف المشفَّرة بواسطة Unicode. والخيار التالي المتاح هو وحدات التخزين ذات الحجم 4 بايتات، والتي يمكنها تخزين أعداد صحيحة حتى حد أقصى يبلغ 4,294,967,295، وهو أكثر بكثير مما نحتاجه فعليًا. لذا، إذا اخترنا 4 بايتات كوحدة تخزين لدينا، فسنملك بالتأكيد مساحة أكثر من كافية لتخزين جميع قيم Unicode، بحيث يُخزن كل حرف بوصفه عددًا صحيحًا يتطلب 4 بايتات (32 بِتًا). ومع ذلك، فإن استخدام 4 بايتات لتخزين كل شيء يعد إهدارًا كبيرًا للمساحة لأن حتى أكبر قيم Unicode تحتاج إلى حد أقصى قدره 21 بِتًا — وهو ما يعني، إذا خُزِّن باستخدام 32 بِتًا، أن 11 من تلك البِتات الـ32 لن تُستخدم أبدًا.

**ملاحظة**: على الرغم من أن نطاق Unicode يمتد من 0 إلى 1,114,111، فإن ليس كل قيمة في ذلك النطاق مستخدمة فعليًا: فلأسباب تقنية، تُعد بعض القيم غير صالحة للاستخدام الفعلي كمحارف Unicode.

### إذن، ما هو UTF-8؟

إذا قرأت عن XeTeX أو LuaTeX فستصادف على الأرجح شروحات تنص على أن تلك المحركات تقرأ النص وملفات إدخال LaTeX بصيغة «UTF-8». فما هي «صيغة UTF-8» وكيف ترتبط بـUnicode؟ في اصطلاح Unicode، تُسمى كل قيمة من قيمه البالغة 1,114,112 قيمة (والممتدة من 0 إلى 1,114,111) والمستخدمة لترميز أحرف العالم [نقطة ترميز](http://www.unicode.org/glossary/#code_point).

لقد رأينا أنه، *نظريًا*، سنحتاج إلى تخزين كل نصنا المشفّر بـUnicode باستخدام 4 بايتات لكل حرف من أجل تمثيل النطاق الكامل لنقاط ترميز Unicode. ولكن، عمليًا، اخترع بعض الأشخاص الأذكياء طريقة بسيطة لتمثيل رقم Unicode واحد (نقطة ترميز) بوصفه *السلسلة* سلسلة من الأرقام الأصغر، ويُخزَّن كل واحد من تلك الأرقام الأصغر في بايت واحد: وهي عملية *تحوّل* عددًا صحيحًا واحدًا (أكبر) إلى تسلسل من أعداد أصغر (بحجم بايت). وبسبب هذا التحويل، لم تعد أحرف ملف النص لدينا ممثلة كلٌّ منها بقيمة رقمية واحدة: إذ يصبح كل حرف *تسلسلًا متعدد البايتات*—يمكن لأي شيء من 1 إلى 4 بايتات (متتالية) في ملف النص أن يمثل حرف Unicode فرديًّا واحدًا (أي قيمة نقطة الترميز الخاصة به).

UTF تعني *تنسيق تحويل Unicode* والكلمة المفتاحية هنا هي *التحويل*. في الجوهر، يمكنك التفكير في UTF-8 بوصفه «وصفة» أو خوارزمية لتحويل قيمة نقطة ترميز Unicode واحدة إلى تسلسل من 1 إلى 4 أجزاء بحجم بايت. ومع ازدياد قيمة نقطة ترميز Unicode يزداد أيضًا عدد البايتات المفردة المطلوبة لتمثيلها بصيغة UTF-8.

هناك أسباب تقنية وتاريخية وراء إنشاء UTF-8، وقصة اختراع UTF-8 [موثقة في رسالة بريد إلكتروني رائعة من عام 2003](https://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt)، والتي تحتوي، قرب بداية الرسالة، على السطر:

> «هذا غير صحيح. لقد صُمِّم UTF-8، أمام عينيّ، على مفرش طاولة في مطعم بنيوجيرسي في إحدى الليالي في سبتمبر أو نحو ذلك من عام 1992.»

#### مثال: الحرف العربي ل

لنأخذ مثالًا على الحرف العربي ل (الاسم Unicode: الحرف العربي لام) الذي تُخصَّص له قيمة نقطة الترميز 1604 (عشريًا) أو 0644 (سداسي عشري): ويمثَّل في UTF-8 بالسلسلة *المكونة من بايتين* D9 84 (سداسي عشري) أو، عشريًا، 217 132. عند استخدام UTF-8 بوصفه الصيغة لتخزين النص، بدلًا من ملف نصي يحتوي على الرقم المفرد 1604 لتمثيل ل، فإنه يُحوَّل إلى قيمتين بحجم بايت: 217 و132 — ويُخزَّن الحرف ل بوصفه *تسلسلًا من بايتين*على مدونتي. [مدونة هذا المؤلف الشخصية](http://www.readytext.co.uk/?p=1284).

عندما يقرأ برنامج ما (مثل XeTeX أو LuaTeX) نصًا بصيغة UTF-8، يحتاج ذلك البرنامج إلى تحديد قيمة Unicode لكل حرف موجود في ذلك الملف، ولذلك يستخدم خوارزمية لـ *عكس* عكس عملية تحويل UTF-8. ومن خلال تلك «الخوارزمية العكسية» يُعاد دمج البايتين (217 و132) لتوليد العدد الصحيح 1604، والذي يمكن عندئذٍ التعرف عليه بوصفه قيمة نقطة الترميز Unicode للحرف العربي ل.

لذا، في الختام، فإن UTF-8 ليس إلا تنسيق بيانات وسيطًا يُستخدم لتخزين ونقل النص المشفّر بـUnicode.

**ملاحظة**: تختار بعض الأنظمة استخدام/تخزين النص باستخدام 32 بِتًا لكل حرف، ويُسمى هذا [UTF-32](https://en.wikipedia.org/wiki/UTF-32)—وهناك أيضًا [UTF-16](https://en.wikipedia.org/wiki/UTF-16) لكن UTF-8 هو الطريقة الأكثر شيوعًا لتخزين النص المشفّر بـUnicode.

## ملفات TeX متعددة اللغات: XeTeX وLuaTeX

كل من XeTeX وLuaTeX قادران على تركيب طباعي متعدد اللغات شديد التعقيد، رغم أن آلياتهما لتحقيق ذلك مختلفة إلى حد كبير وتعكس فلسفة التصميم/التطوير لكل محرك. لن نستكشف ذلك بعمق، لكننا نلاحظ ببساطة أن محرك XeTeX يتضمن مكونات برمجية (مضمنة في ملفه التنفيذي) غير موجودة في LuaTeX — وأبرزها برمجيات لعملية تُسمى *تشكيل OpenType* (مثلًا، عبر مكتبة تُسمى [HarfBuzz](https://www.freedesktop.org/wiki/Software/HarfBuzz/)).

أما LuaTeX، فعلى النقيض، فيتبع نهجًا مختلفًا: فبدلًا من بناء الإمكانات مباشرة داخل محرك TeX نفسه، يوفّر LuaTeX مجموعة غنية للغاية من الأوامر (البدائيات TeX) و [واجهة برمجة تطبيقات قائمة على Lua](/latex/ar/mqalat-mtamqh/07-an-introduction-to-luatex-part-1-what-is-it-and-what-makes-it-so-different.md) شديدة القوة، يستطيع من خلالها المطورون بناء حلول متقدمة بنفس الدرجة للتركيب الطباعي متعدد اللغات. وعلى الرغم من أن فلسفة LuaTeX قد تقتضي جهدًا إضافيًا من مطوري حزم LaTeX، فإنها توفر قدرًا كبيرًا من المرونة الإضافية لأن الحلول لا تكون «مشفرة على نحو ثابت» داخل محرك LuaTeX نفسه، بل تُبنى من شيفرة TeX وLua — أو من ملحقات مكتوبة بـ C/C++.

**ملاحظة جانبية**: قد يهتم القراء الذين يرغبون في استكشاف عالم تشكيل OpenType الرائع، لكنه معقد، بقراءة عن المكتبة مفتوحة المصدر الممتازة المسماة [HarfBuzz](https://www.freedesktop.org/wiki/Software/HarfBuzz/)—المستخدمة في كثير من التطبيقات بما فيها Firefox وChrome وLibreOffice وبالطبع XeTeX. وقد استخدم مؤلف هذه المقالة HarfBuzz لإنشاء [إضافات LuaTeX لتنسيق النص العربي](http://www.readytext.co.uk/?p=3186).

أصبح من الشائع الآن (مثلًا، على وسائل التواصل الاجتماعي) نقل نص يحتوي على أحرف من لغات متعددة، ويمكن لملف نصي UTF-8 يخزن نصًا متعدد اللغات أن يحتوي بسهولة على أحرف تكون تمثيلاتها في UTF-8 بطول 1 أو 2 أو 3 أو 4 بايتات. لذا، فالواقع أن ملف نص UTF-8 ليس إلا تدفقًا من بايتات مفردة، لكن كل حرف فعلي في ذلك الملف قد يكون بطول يتراوح بين 1 و4 بايتات: إذ أصبحت الأحرف الفردية *تسلسلات متعددة البايتات*.

لاستكشاف بعض الجوانب الأساسية للعمل مع النص متعدد اللغات (وتركيبه طباعيًا) سنستخدم مثالًا يحتوي على الكتابة العربية لأن العربية تتيح لنا مجالًا لمعالجة مفاهيم متعددة.

#### ملاحظة جانبية: الكتابة العربية

ال [الكتابة العربية](https://en.wikipedia.org/wiki/Arabic_script) تُكتب بأسلوب متصل يُقرأ ويُكتب من اليمين إلى اليسار. ويمكن لكل حرف عربي، من حيث المبدأ، أن يتخذ واحدة من 4 أشكال مختلفة وفقًا لـ:

* ما إذا كان معروضًا بوصفه حرفًا منفردًا قائمًا بذاته (معزولًا) لا يتصل بأي شيء آخر؛
* ما إذا كان يقع داخل كلمة — في بدايتها أو وسطها أو نهايتها: ويشار إلى ذلك بصيغ *البدئية*, *الوسطية* و *نهائي* والنهائية على الترتيب.

لكل حرف من أحرف الكتابة العربية مجموعته الخاصة من قواعد الوصل وقد يتغير شكله/مظهره أو لا يتغير عندما يكون له حرف آخر إلى يساره أو يمينه أو على يساره ويمينه. ويمكن للقراء الراغبين في استكشاف هذا الأمر أكثر أن يجدوا [قائمة كاملة على ويكيبيديا](https://en.wikipedia.org/wiki/Template:Arabic_alphabet_shapes/joining).

#### مثال: نص عربي وإنجليزي بصيغة UTF-8

لنفترض أننا أنشأنا ملف نص UTF-8 يحتوي على سطر واحد من النص الإنجليزي والعربي: This is العَرَبِيَّة text!

يحتوي هذا السطر من النص على 3 أحرف مسافة، و11 حرفًا إنجليزيًا (من الكتابة اللاتينية) و12 حرفًا عربيًا (على الرغم من أن ذلك قد لا يكون واضحًا/ظاهرًا مباشرة). وعندما يُحفظ بوصفه ملف نص UTF-8 فإنه يشغل 38 بايتًا من التخزين، ناتجة عما يلي:

* **الكتابة اللاتينية**: المسافات بالإضافة إلى النص الإنجليزي: 14 ✕ حرفًا بحجم 1 بايت = 14 بايتًا؛
* **الكتابة العربية**: 12 حرفًا عربيًا ✕ 2 بايت لكل حرف = 24 بايتًا.

المجموع 14 + 24 = 38 بايتًا.

#### التعمق أكثر

إذا حفظنا نص مثالنا في ملف UTF-8 يسمى `arabic.txt` ثم فتحناه في محرر سداسي عشري يمكننا فحصه لرؤية البايتات الفعلية التي يحتويها. ومن دراسة لقطة الشاشة المعلَّقة التالية يمكنك أن ترى أن النص العربي مخزن بمقدار بايتين لكل حرف:

![ملف نص UTF-8 يحتوي على نص إنجليزي وعربي مفتوح داخل محرر سداسي عشري.](/files/1fb14f8403143c947dea856a5c22614a47b30ce3)

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

يمكنك استخلاص ملاحظتين من هذه اللقطة:

* يُخزن النص العربي في تسلسل من اليسار إلى اليمين، والأحرف هي النسخ الخام غير المشكَّلة (المعزولة) من الحروف العربية والحركات؛
* ولا توجد أي معلومات إضافية بعد نص الكتابة اللاتينية «This is » لإبلاغ أي برنامج يقرأ هذا الملف بأن الحرف التالي هو من الكتابة العربية.

إذا كنت تركّب مستندًا متعدد اللغات (مثلًا يحتوي على الإنجليزية والعربية)، فعند قراءة/معالجة ملف الإدخال النصي (كتدفق من البايتات) يجب أن يكون XeTeX أو LuaTeX قادرًا على اكتشاف بداية ونهاية كل حرف وقراءة العدد الصحيح من البايتات اللازمة لعكس تحويل UTF-8 وتوليد نقطة الترميز Unicode المقابلة. إن خوارزمية UTF-8 نفسها هي التي تتيح للبرنامج القيام بذلك: إذ تمكّنه من اكتشاف البايت الأول لكل حرف على حدة ومعرفة عدد البايتات التي ينبغي قراءتها من أجل حساب نقطة الترميز Unicode المقابلة. UTF-8 سهل الاستخدام، لكنه في الحقيقة عبقري للغاية.

#### الترتيب المنطقي، وترتيب العرض، وتشكيل OpenType

إذا نظرت عن قرب إلى النص العربي أعلاه (العَرَبِيَّة) فقد يكون من الصعب رؤية أن ملف النص لدينا يحتوي بالفعل على 12 حرفًا عربيًا منفصلًا — خصوصًا إذا لم تكن معتادًا على الكتابة العربية! ومع ذلك، إذا عددت بعناية الأحرف العربية المعروضة على الجانب الأيمن من لقطة الشاشة أعلاه فسترى أن العدد الإجمالي هو 12.

بالنسبة للغات ذات الكتابة المعقدة، مثل العربية، فإن ما يحتويه ملف النص لدينا *يخزن* وما تراه أنت *على الشاشة* يكونان *جدًا* مختلفين بصريًا بالفعل! فما تراه عند عرض ذلك النص في، مثلًا، متصفح، هو (بحسب الخط المستخدم):

![صورة لنص عربي مُركَّب طباعيًا](/files/20d5b30ab40bb640078f6931814decf024a67c63)

لكن، كما تُظهر لقطة الشاشة أعلاه، فإن ما يحتويه ملف نص UTF-8 فعليًا هو هذا:

![صورة لنص عربي غير مركب طباعيًا (أحرف معزولة)](/files/14362c31934db3673aff122d48c7c7025bdff47a)

حتى إذا لم تكن على دراية بالطبيعة المتصلة للكتابة العربية، يمكنك أن ترى بوضوح أن «شيئًا ما» قد حدث أثناء نقل أحرف عربية موجودة في ملف نصي إلى مرحلة التركيب الطباعي و/أو العرض على الشاشة (بوصفها رموزًا رسومية). إذا كنت معتادًا على استخدام TeX/LaTeX مع اللغات ذات الكتابة البسيطة، مثل اللغات القائمة على اللاتينية، فقد يكون هذا مربكًا جدًا بالفعل!

هناك بعض المفاهيم المهمة في العمل هنا لأن ملفات نص Unicode تتعامل مع تخزين… حسنًا، النص (Unicode)، بينما تتعامل أنظمة التركيب والعرض مع استخدام الخطوط والرموز الرسومية (OpenType):

* حفظ ملف النص الأحرف العربية بترتيب من اليسار إلى اليمين، لكن العربية تُقرأ/تُعرض من اليمين إلى اليسار: فملفات النص تخزن النص في ما يُسمى *الترتيب المنطقي*;
* يحتوي ملف النص على أحرف فردية تبدو مختلفة جدًا عن العرض الفعلي المقدم على الشاشة: فالملف يحتوي على الأحرف العربية بصيغتها المعزولة غير المتصلة.

#### ماذا يحدث هنا؟

داخل ملف نصي تُخزن العربية كتسلسل من أحرف الصيغة المعزولة من اليسار إلى اليمين: إذا فكرت في الأمر، فإن ملف النص يخزن النص العربي بالترتيب/التسلسل *الذي كُتب به* (الـ *الترتيب المنطقي*). ولا يصبح هذا النص معروضًا بترتيبه القرائي الصحيح، والذي يُشار إليه غالبًا بـ *الترتيب المرئي* أو *ترتيب العرض*؛ بالإضافة إلى ذلك، فإن الأشكال المعزولة للأحرف العربية تُ *شكَّل* إلى نسخ العرض الصحيحة طباعيًا. وإحدى الطرق للتفكير في هذا هي أن ملفًا نصيًا بسيطًا يجب أن يخزن النص (محارف Unicode) في أبسط صورة ممكنة: أحرف نصية خام، غير مشكَّلة، فردية — وتتمثل مهمة برامج النظام في عرض تلك الأحرف اعتمادًا على نظام التشغيل والخطوط وبرامج التركيب/العرض المتاحة على جهاز العرض.

تشكيل OpenType *تشكيل*تموضع OpenType *تشكيل OpenType*—عملية تشمل مجموعة واسعة من العمليات الطباعية التي يمكن أن تتضمن:

* استبدال عدة رموز رسومية فردية برمز وصلي مركّب واحد (وهو أمر شائع جدًا في العربية)، أو
* عمليات تموضع تقوم، على سبيل المثال، بضبط مواضع حروف العلة العربية بناءً على الرمز الرسومي الذي تقع فوقه أو تحته.

![صورة تُظهر التحول الذي يطرأ على النص العربي عند تنسيقه طباعيًا](/files/3a62ec805ee3bda3dd85d2414fa6328832974808)

الفرق بين الترتيب المنطقي والترتيب البصري (العرض). في هذه الصورة يمكنك أن ترى أن الأحرف العربية المخزنة في ملف نصي تخضع لإعادة الترتيب والتشكيل عند عرضها أو تنسيقها طباعيًا.

يستثمر المصممون ومطورو خطوط OpenType المتقدمة وقتًا وخبرة كبيرين جدًا لتوفير القدرات الطباعية المتطورة المدمجة في خطوطهم.

لإيقاف التشكيل المطبّق على النص العربي يمكننا استخدام البرنامج الممتاز والمجاني، [BabelPad](http://www.babelstone.co.uk/Software/BabelPad.html) محرر نصوص Unicode (لـ Windows فقط) يتيح لك تعطيل التشكيل لرؤية الأحرف الخام المفردة غير المتصلة (غير المشكّلة) الموجودة فعليًا في ملف النص—انظر النصف السفلي من لقطة الشاشة المجمعة هذه:

![صورة تُظهر قدرة محرر النصوص BabelPad على إيقاف تشكيل OpenType](/files/7142c527e2c38fa1caf186845b8637d7e6630e5d)

استخدام محرر النصوص Unicode BabelPad لتشغيل تشكيل OpenType (الشكل العلوي) أو إيقافه (الشكل السفلي). إن إيقاف تشكيل OpenType يجعل تحرير النص العربي أسهل بكثير.

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


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/ar/mqalat-mtamqh/51-unicode-utf-8-and-multilingual-text-an-introduction.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
