الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

حل مشكلة اللغة العربية

بدأه albara2006 في 24 يونيو 2008 · 4 رد · 1,718 مشاهدة · في قسم برمجة الألعاب و الرسوميات العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله

لقد واجهتني كثيرا مشكلة الكتابة باللغة العربية عند تعلمي للغة البرمجة "سي" على "التوربوسي"

فكما تعلمون أن الكومبايلر يدعم اللغة الانجليزية , وإذا أردت أن تصمم برنامج لكتابة جملة انجليزية فما عليك إلا استخدام دالة printf

ولكن في أحد المرات كنت أريد تصميم برنامج أستخدم فيه أسماء عربية , ولكنني تفاجئت بأنه لا يوجد دالة أستطيع استخدامها لطباعة كلمة عربية على الشاشة السوداء

سألت زملائي الطلبة وبكنهم أخبروني أن الدوس لا يدعم اللغة العربية إلا في بعض الاصدارات التي اندثرت

جلست أفكر , وأحدث نفسي أنهم إن استطاعو ادخال اللغة الانجليزية , فلماذا لا يمكننا ادخال اللغة الانجليزية

ولكني تركت هذا الأمر ورضيت بالأمر الواقع إبى أن طلب منا "الدكتور" واجبا وكان أحد الاسئلة هو أن تكتب برنامج يقوم برسم شكل ما , وبعد انتهائي من حل الواجب خطر ببالي فكرة

وقلت في نفسي لما لا أقوم برسم الحروف العربية , مثلا أقوم بكتابة برنامج لرسم حرف الصاد مثلا

وبالفعل نجح الأمر, ولكن لرسم حرف الصاد تطلب مني استخدام 3 دوال رسم ودراسة أبعاد الحرف

1.bmp

وفرحت كثيرا بهذا الانجاز وعقدت العرزم على أن أقوم بتصميم كل الحروف , وبالفعل انشأت عدة دوال كل دالة ترسم حرف معين

ولكنني كنت أريد أن أصمم برنامج يقوم المستخدم فيه باختيار حرف معين

فجلست أفكر "ما العمل" فخطر ببالي أن أنه إذا أدخل المستخدم الحرف الانجليزي

a

يقوم البرنامج برسم الحرف المقابل له في الكيبورد وهو الحرف

ش

وبالفعل نجح الأمر واستطعت أن اكتب برنامج يختار فيه المستخدم عرض أي حرف عربي

ولكن إذا أدخل المستخدم أكثر من حرف فإن الحروف تكتب فوق بعضها

2.bmp

, لذا قمت بتعديل البرنامج وذلك بأن يقوم البرنامج بعمل مسافة بين كل حرف وحرف

لكن حتى الآن كل ما فعلناه هو رسم حروف مقطعة وليس متصلة

فجلست أفكر كيف سألصق الحروف معا

كان يلزمني أولا أن أرسم جميع حالات الأحرف , فمثلا حرف العين , في بداية الكلمة وفي وسط الكلمة وفي نهاية الكلمة ومنفرد

وهذه 4 حالات وبالفعل رسمتها جميعا

3.bmp

ولكن واجهتني مشكلة في ربط الحروف بالكيبورد لأن عدد أزرار الكي بورد لا تكفي لجميع الحالات

وبعد تفكير وجد أن الحل هو في عمل رقم خاص لكل حالة , ورتبت الحروف العربية في جدول بحيث يكون لكل حالة رقم خاص بها

4.bmp

ستسألني: وكيف تربط الأرقام بالكيبود

سأقول لك: نربط الحرف المفرد فقط , يعني نربط حالة واحدة ومن ثم نعمل اخيبار للحروق السابقة

فقد قمت بعمل دوال تدرس الحرف السابق إن كان يلتصق أولا وتصوم بتحديد الحالة اللمفترضة للحرف الحالي وبمجرد كتابتك للحرف اللذي بعده يتم التحقق من الحرفين الأول والثاني وتعديل مايلزم

وبذلك تمكنت من الكتابة باللغة العربية على شاشة دوس باستخدام الرسم

5.bmp

وللحديث بقية إن شاء الله

فقد تمكنت من استخدام هذه الطريقة في مكتبة

OpenGL

6.bmp

#2

وعليكم السلام ورحمة الله وبركاته ,

قصة جملية :) .

أعمل حاليا على مشروع مشابه تماما .. سأضعه هنا بعد أيام ان شاء الله .

الهدف هو رسم حروف عربية .. لكن هذه المرة بالاستفادة من FreeType .. حتى لا اضطر لرسم الحروف بنفسي :) ..

يوجد هناك أداتين لرسم الحروف العربية بمختلف اشكالها .... لعلها تفيدك .. وكلها بأيدي عربية :) :

أداة " صانع الخط العربي " وصلت

برنامج توليد الخطوط بلاحقة BMP

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

بارك الله فيك أخي الشمري على التفاعل , لكن روابط التحميل لا تعمل فلعلك تجددها قريبا , أخي الشمري لقد سبقتني بالحديث عن مولد الحروف ,لأني صممت من قبل برنامج لتوليد الحروف بدلا من كتابتها يدويا , وقد كنت أنوي الحديث عن ذلك في تكملة الموضوع.............

أعود الآن لإكمال ما بدأته:

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

وكما أخبرتكم فقد تعلمت أساسيات برمجة الرسم وبذلك استطعت تصميم برنامج لرسم الحرف باستخدام الماوس بدلا من كتابة الدوال يدويا

وهذه واجهة البرنامج:

18429336lk4.th.jpg

وبذلك يمكنك رسم جميع حالات الحروف بسهولة ويسر

ستسألني وكيف سأستخدم هذه الحروق المرسومة

سأقول لك: يقوم البرنامج بتحويل صورة الحرف إلى ملف نصي , ومن ثم يمكنك استعماله بتحويله إلى صورة , وقد قمت بالفعل بكتابة برنامج التحويل ونجح المشروع بالفعل:

25495369ej2.th.jpg

وقد قمت بتأليف كتاب شرحت فيه كيفية استعمال هذه الطريقة في برامجك:

47184390fq1.th.jpg

وللحديث بقية وسأخبركم إن شاء الله عن الطريقة الجديدة التي اخترعتها لاضافة الحروف وهي أفضل من الطريقتين الأولى والثانية ونتائجها مبهرة ولم أكن أتوقع أن أصل لهذه المرحلة من قبل , وللحديث بقية إن شاء الله

لتحميل الكتاب مرفق معه البرنامج: يمكنك زيارة موقعي

تم تعديل هذه المشاركة بواسطة albara2006 في 26 يونيو 2008 في 01:35

#4

السلام عليكم ..

مشروعك رائع أخي .. وأهنيك عليه .. لدي بعض الملاحظات التي تضيف لمشروعك ولا تعيبه ..

* الجزئية الخاصة باختبار الحروف .. مثل الدالة convet_ar_to_en

	case 'ذ': c='`'; break;
	case 'د': c=']'; break;
	case 'ج': c='['; break;
	case 'ح': c='p'; break;
	case 'خ': c='o'; break;
	case 'ه': c='i'; break;
	case 'ع': c='u'; break;
	case 'غ': c='y'; break;
	case 'ف': c='t'; break;
	case 'ق': c='r'; break;
	case 'ث': c='e'; break;
	case 'ص': c='w'; break;
الخ ..

هناك الكثير من جمل الشرط .. وانت تعرف ان هذا قد يقلل من سرعة برنامجك .. طبعا نحن نتكلم عن اجزاء من الثانية ..

الحل حسب وجهة نظري هو باستخدام Data Structure التي تحل كثير من هذه المشاكل .. استخدم مثلا std::map ..

* فكرتك في تخزين الحروف في ملف خارجي رائعة ,, ولكن اقترح أن تضع خط معيّن ليكون default .. افتراضي .. في مصفوفة داخل المكتبة .. بالتالي لو أراد المستخدم عمل ديمو سريع .. فهو ليس بحاجة لتضمين الملفات مع الديمو ..

هذه الطريقة مطبقة في أغلب المكتبات .. ستكون كالتالي :

int FONT1_Character_097[] = {  8,  0,  0,116,140,132,124,  4,120,  0,  0,  0,  0,  0}; /* "a" */

لو أخذنا أي حرف موجود في أحد ملفاتك :

00000000000000000000
00000000000011011000
00000000000011011000
00000000000000000000
00000000000000000000
00000000000001111000
00000000000010000100
00000000000110000110
00000000001100000011
00000000001000000001
00000000001100000011
00000000000111111110
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
00000000000000000000
=

حوّل كل سطر الى قيمة ست عشرية .. حتى يسهل تخزينها في مصفوفة .. ,وبالتالي لو عملنا ديمو سريع .. لانضطر في كل مرة الى ارفاق الخطوط مع البرنامج ...

أخيرا .. يبدو أني سأضمن ذلك الى مشروعي age .. بعد اذنك :) ..

تم تعديل هذه المشاركة بواسطة الشمري في 27 يونيو 2008 في 17:53

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#5

بارك الله فيك أخي الشمري , وإضافتك طيبة وعملية جدا , وحاليا أفكر في تضمين طريقة LRU (in page replacement algorithm )

وهي طريقة عمليا جدا للاقتصاد في استخدام الرام

حقيقة الكلام يجر بعضه ويطول , وعندي كلام كثير أود قوله ولكن الوقت لا يسعفني والكتابة أبطأ من أن تحتوي ذلك , ويسرني كثيرا أنك استفدت من هذا البرنامج

وعسى أن يكون بيننا تعاون للوصول إلى أفضل نتيجة

تحياتي أخي الشمري وبالتوفيق

مواضيع مشابهة