المشكلة التقليدية في بعض البرامج اللتي لا تدعم العربية تتمركز حول نقطتين: عدم توصيل الحروف, و عدم ترت يبها من اليمين الى اليسار مثلا, لو أردت كتابة
تجربة
فإنها قد تظهر بالشكل التالي:
ة ب ر ج ت
الحل اللذي يتبعه البرنامج هو استبدال الحرف بشكله (هناك في اليونيكود رموز خاصة بالاشكال المختلفة لكل حرف), بحيث تكون النتيجة (تقريبيا) على هذا الشكل:
ﺗ ﺠ ﺮ ﺑ ﺔ
(مع ازالة المسافات بين الحروف, فقد وضعت للتوضيح فقط) و عندها فإن النص سيظهر بشكل جيد في اي برنامج يدعم اليونيكود اي ان البرنامج لا يصدر اي صورة, كل ما يصدره هو نسخة معالجة من الجملة هناك شقين للمشكلة: اولا شكل الحروف, ثانيا ترتيبها في السياق ذو الاتجاه المعاكس. شكل الحروف: بشكل عام, حروف اللغة العربية لها أربع أشكال, و هذه الأشكال تعتمد على موقع الحرف في الكلمة: منفصل: عندما يكون الحرف مكتوبا لوحده, مثلا: حرف العين شكله المنفصل هو: ع ابتدائي: عندما يكون الحرف في أول الكلمة, مثلا: عـ منتصف: عندما يكون الحرف في منتصف الكلمة, مثال: ـعـ انتهائي: عندما يكون الحرف في آخر الكلمة, مثال: ـع و لكن, هذا ليس كل شيء, هناك حالات يكون فيها الحرف في منتصف الكلمة دون أن يأخذ الشكل الانتصافي مثل حرف العين في كلمة "دعاء", حرف العين هنا يأخذ الشكل الابتدائي بالرغم من أنه في منتصف الكلمة! لماذا؟ لأنه مسبوق بحرف الدال, و حرف الدال لا يتصل بالحرف اللذي يليه, لذلك فإن أي حرف يلي حرف الدال لن يتصل به. فشكل الحرف إذا ليس محددا فقط حسب موضعه في الكلمة, بل بخاصيتين أخريين: هل يستطيع هذا الحرف الاتصا ل بالحرف السابق؟ و هل يستطيع الاتصال بالحرف اللاحق؟ هناك في اليونيكود مجموعتان للحروف العربية: الأولى تعنى بالأشكال القياسية للحروف: http://www.unicode.org/charts/PDF/U0600.pdf والثانية تضم الأشكال الأخرى لكل حرف: http://www.unicode.org/charts/PDF/UFE70.pdf عند دراسة هذين الجدولين نلاحظ أولا ان الجدول الثاني يشير الى كل شكل بأنه شكل فرعي من حرف معين في الجدو ل الأول, مثلا: الشكل الانتهائي لحرف الباء رمزه FE90 و نلاحظ انه معرف كالتالي:
ARABC LETTER BEH FINAL FORM <final> 0628
و الرقم 0628 هو كود الشكل القياسي لحرف الباء. الملاحظة الأخرى هي أن الشكل القياسي لكل حرف (في الجدول الأول) هو عادة شكل الحرف عندما يكون منفصلا ( ع مثلا ) و لكن رغم ذلك, هناك شكل في الجدول الثاني يمثل الشكل المنفصل لكل حرف (رغم أنه نفس الشكل القي اسي) فالشكل المنفصل لحرف الباء هو FE8E و هو معرف على أنه
<ioslated> 0268
لذلك سنضيف خاصية جديدة الى الحروف, و هي الشكل القياسي, مع الإبقاء على الشكل المنفصل أيضا. القضية الثانية هي ترتيب الحروف من اليمين الى اليسار. البرامج اللتي لا تدعم العربية عادة ما يكون ترتيب الحروف فيها من اليسار الى اليمين, اي اننا لا يكفي ان نوصل الحروف ببعضها, و لكن يجب ايضا ان نعكس ترتيبها لكي نخدع البرنامج و نجعله يرسمها بالشكل الصحيح. يمكننا ان نعكس جميع الحروف, و لكن لو فعلنا ذلك فإن الكلمات الانكليزية ايضا ستنعكس, لهذا ما نقوم به هو تحليل الكتابة و تقسيمها الى اقسم, كل قسم مكون من سلسلة حروف ذات اتجاه واحد, اي تقسيم النص المتعدد الاتجاهات الى قطع, كل قطعة تكون ذات اتجاه واحد. المقصود باتجاه النص هو طبيعته, يعني النصوص العربية اتجاهها يبدأ من اليمين الى اليسار, و الانكليزية تبدأ من اليسار الى اليمين. فالنص اللذي يحتوي على احرف عربية فقط, يكون اتجاهه بالكامل من اليمين الى اليسار, اما النص اللذي يحتوي بالكامل على احرف انكليزية, فاتجاهه يكون من اليسار الى اليمين. اما النصوص اللتي تحتوي على خليط من الكلمات العربية و الانكليزية فيمكن ان نسميها نصوص مختلطة الاتجاهات او متعددة الاتجاهات. هناك رموز ليس لها اتجاه معين في حد ذاتها, مثل المسافة و الرموز الرياضية و علامات الترقيم, فهذه يمكن ان تكون ضمن نص عربي, و بالتالي يكون اتجاهها تبعا للنص اللذي يحيطها, و يمكن ان نقول ان هذه الرموز حيادية الاتجاه, اي اننها لا تتبنى اتجاها معينا في حد ذاتها. لو كان النص مكونا من خليط عربي و انكليزي, اي اتجاه الحروف فيه بهذا الشكل: RRRLLLRRRLLLLLRRRRR نقوم بتقسيمه في هذا المثال الى خمسة اقسام, نقوم بقلب الاقسام التي يبدأ اتجاهها من اليمين R ثم نعيد جميع هذه الاقسام مع بعضها. ماذا عن الرموز الحيادية؟ يتم التعامل معها بناء على سياقها, اما ان يتم تحويلها الى اتجاه معين, او تبقى على حالها (حيادية) و بالتالي عند تقسيم النص قد نجد قسما "حياديا" الطريقة اللتي يتبعها البرنامج هي: اذا كان الرمز السابق له اتجاه معين و الرمز التالي له نفس ذلك الاتجاه او له اتجاه حيادي, فحول الاتجاه من حيادي الى نفس اتجاه الرمز السابق, و الا ابقه حيادي الاتجاه. مثلا: مثال سهل: RRR N RRR N LLL ^ ^ R N و النتيجة ---> RRRRRRR N LLL مثال اعقد قليلا: RRR NNN LLL ^^^ RRN و النتيجة ---> RRRRR N LLL بعد ان تم حل هذه المسائل الرئيسية, ظهرت مشاكل اخرى فرعية كان لا بد من التعامل معها: اولا, اللام الف, يجب ان يتم دمجهما قبل معالجة النص ثانيا, الحركات: وجود حركات التشكيل في وسط الكلمة يشوش على السياق, فبدلا من ان يرى المعالج الحرف التالي, سيرى الحركة الموجودة فوق الحرف الحالي. لتجاوز هذه المشكلة كان لا بد من نزع الحركات و وضعها في هيكل بياني مناسب بحيث يمكن اعادة وضع الحركات بعد معالجة اشكال الحروف.