تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
مقارنة الكلمات و الأسماء العربية برمجيا
#1
السلام عليكم ورحمة الله وبركاته

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

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

ولتوضيح الموضوع علينا أن نفهم كيف تكتب الحروف العربية في الأصل و ماهي الحالات التي تظهر بها الحروف العربية

الحالة الأولي:

أن الحرف قد يظهر منفردا أو منعزلا وكمثال علي ذلك حرف الواو من الممكن ان يظهر هكذا (و) او حرف الألف من الممكن أن يظهر هكذا (أ) او حرف الحاء (ح) وهكذا مع بقية الحروف الأخري.

الحالة الثانية:
ان الحرف قد يكون جزء من كلمة و ربما يظهر في وسط هذه الكلمة وهنا قد يكون الحرف مقرونا بشئ اخر وكمثال علي ذلك حرف الحاء (ح) مثلا من الممكن ان يظهر هكذا ( ـــــحـــــ.) وهكذا مع بقية الحروف الأخري.


الحالة الثالثة:
أن الحرف من الممكن أن يظهر في نهاية الكلمة او تختتم به الكلمة مثل حرف الألف فهو يكتب هكذا (ـــــا) او حرف الحاء (ــــح) وهكذا مع بقية الحروف الأخري.


الحالة الرابعة:
ان الحرف يظهر في اول الكلمة مثل حرف الألف فيظهر كأنه منفردا هكذا (أ) او حرف الحاء فيظهر متصلا بشئ ما هكذا ( حــ ) وهكذا مع بقية الحروف الأخري.


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

أو هكذا ............................. محمد

ومن المؤكد اننا وحين تريد مقارنة الاسم برمجيا سنكتشف انه قد يكون لدينا حالات كثيرة للكلمات او الحروف او الأسماء

الأن يأتي السؤال كيف نقارن بين كل هذه الأشكال من الكلمات برمجيا؟

حين كنت طالبا منذ فترة طويلة كنت أسمع أستاذ اللغة العربية رحمة الله عليه يردد دوما ........ عليك إرجاع الشئ لأصله  .... وهذه الكلمات وبالرغم من بساطتها فهي تمثل الاجابة الدقيقة علي السؤال الذي سألناه

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

سؤال أخر لماذا هذه المعاناة ولماذا يجب علينا أن نكتب هذا الكود؟

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

و ربما أفرب مثال علي ما أقوله و للتأكد من صحة كلامي ..... حاول أن تكتب قليلا من الكلمات او الحروف بالعربية في برنامج مثل NotePad و انظر ماذا سيحدث معك عندما تريد حفظ هذا الكلمات في ملف تكست عادي جدا

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

المصفوفة المستخدمة في مقارنة المدخلات

PHP كود :
   Public ReadOnly Property ValidCharacterRange As IEnumerable(Of Char)
 
       Get
            Dim arabicChars 
As List(Of Char) = New List(Of CharFrom {"أ""ا""ب""ت""ث""ج""ح""خ""د""ذ""ر""ز""س""ش""ص""ص""ض""ط""ظ""ع""غ""ف""ق""ك""ل""م""ن""ه""و""ي"}
 
           Return arabicChars
        End Get
    End Property 

الدالة التي تقوم بالتاكد من صحة المدخلات وهي لها شكلان

PHP كود :
Public Function ValidateString(value As String) As String
        Dim valueString 
As String CType(valueString)
 
       If Not (String.IsNullOrEmpty(ValueString)) Then
            valueString 
ValidateString(valueStringValidCharacterRange)
 
       End If
 
       Return valueString
    End 
Function

 
   Public Function ValidateString(value As StringcharacterRange As List(Of Char)) As String
        Dim sb 
= New System.Text.StringBuilder()
 
       For Each chr As Char In value
            If characterRange
.IndexOf(chr) >= 0 Then
                sb
.Append(chr)
 
           End If
 
       Next
        Return sb
.ToString()
 
   End Function 

الدالة النهائية التي تستخدم في مقارنة المدخلات

PHP كود :
  Public Function CompareArabicStrings(s1 As Strings2 As String) As Boolean
        If 
((s1 Is NothingOrElse (s2 Is Nothing)) Then
            Return 
(s1 s2)
 
       End If
 
       Return ValidateString(s1).Equals(ValidateString(s2))
 
   End Function 

كيف نستخدم الدالة لمقارنة المدخلات

PHP كود :
Dim mohamed1 As String "محمـــــد"
 
       Dim mohamed2 As String "محمـــــــد"

 
       If CompareArabicStrings(mohamed1mohamed2Then
            MessageBox
.Show(mohamed1.ToString " Equal " mohamed2.ToString)
 
       End If 

تقبلو تحياتي
وبالتوفيق للجميع
الرد }}}}
تم الشكر بواسطة: hamada558 , HASAN6.0
#2
محاوله جيده  سيدي الفاضل  و لكن تبقى ناقصه و عقيمه و عمياء في نقاط عده دعني اذكرها  ،،  
فالكود الذي بالاعلى لو كُتبت بالصيغه التاليه  ، سوف تختصر وقتك عن كتابة الاسطر التي كتبتها ، لاحظ معي :


كود :
        Dim mohamed1 As String = "احمــــــــد"
        Dim mohamed2 As String = "احمد"
        If String.Compare(mohamed1, mohamed2) = 0 Then
            MessageBox.Show(mohamed1.ToString & " Equal " & mohamed2.ToString)
        End If

بالنسبه للترميز و ظهور الحروف بغير شكلها  لها عدة اسباب من ضمنها  الترميز  للنص قبل الحفظ  أما اذا كنت تستخدم قواعد بيانات مثلا SQL  Server   ظهور الحروف على شكل علامات استفهام او رموز غريبه ، هذا بسبب اختيارك الترميز الخاطئ  للنص  و للحقل و قاعدة البيانات ككل ، كأصغر مثال ما هو الفرق بين  varChar  و NvarChar  في نوع حقل ما  في قاعدة البيانات ...؟


على العموم  تحتاج لفته مننا لتطوير كلاس ليتعمل مع مشكلة المقارنه  ، على سبيل المثال لو اخذت المثال مره اخرى و كتبت

كود :
       Dim mohamed1 As String = "أحمــــــــد"
        Dim mohamed2 As String = "احمد"


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

لذلك الحل  يفيد عند البحث في قاعدة البيانات  ، ولكن في المقارنه  أعتقد انه يجب ان نعيد النظر و نحسن من اكواد المعالجه قليلاً ، و لكن تبقى بدون اعتماديه
اسم معرفي : محمد يحيى
الرد }}}}
تم الشكر بواسطة: hamada558 , HASAN6.0
#3
إقتباس :و لكن تبقى ناقصه و عقيمه و عمياء
اولا حين ترد علي اي انسان عليك ان ترد باسلوب علمي  وترد باحترام
ثانيا لتقرأ الكلام جيدا ثم ادرس الكود و افهمه جيدا ثم عد لتناقشني باسلوب مهذب كيفما شئت

و إن كنت تستطيع ان تكتب كودا لتحقيق نفس الفكره عليك ان تكتبه ثم نقارن بين ما كتبته انا و ما سوف تكتبه انت
الرد }}}}
تم الشكر بواسطة: HASAN6.0
#4
إقتباس :محاوله جيده  سيدي الفاضل  و لكن تبقى ناقصه و عقيمه و عمياء في نقاط عده دعني اذكرها  ،، 
لك الود و الاحترام و انا لم انتقد شخصك ، و اعترف عندما كتبت (ناقصه و عقيمه و عمياء) فعلاً لم اقصدها كتعنيف او هجوم على طرحك ، ولو قرأت السطر كاملا لربما اتضحت لك الفكره
اسم معرفي : محمد يحيى
الرد }}}}
تم الشكر بواسطة: HASAN6.0
#5
إقتباس :وفي هذا الموضوع سنناقش كيفية التأكد من صحة المدخلات المكتوبة باللغة العربية قبل حفظها أو قبل استخدامها بشكل ما مثل حفظها في برامج الداتابيز مثلا

هذا إقتباس لما كتبته انا حرفيا في الموضوع

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

وطبقا للخبرة البسيطة التي املكها فأنا أعلم جيدا أن هناك فارق بين  String.Compare و String.Equal

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

PHP كود :
      Dim s1 As String "محمـــــد"
 
       Dim s2 As String "محمـــــــد"

 
       If (String.Compare(s1s2StringComparison.OrdinalIgnoreCase) = 0Then
            Me
.Close()
 
       End If

 
       If (String.Compare(s1s2StringComparison.Ordinal) = 0Then
            Me
.Close()
 
       End If

 
       If s1.Equals(s2Then
            Me
.Close()
 
       End If 

وعموما لو الكود الذي كتبته انا لا يناسبك يمكنك بكل بساطة إهماله و التفكير في كود يناسبك
الرد }}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  ترجمة النصوص من الإنجليزية الي العربية بين الواقع و الخيال silverlight 0 393 19-12-15, 05:12 PM
آخر رد: silverlight
  [VB.NET] كيفية انشاء قاعدة بيانات برمجيا VB.net (صوت وصورة) أحمد النجار 0 724 18-01-15, 06:59 AM
آخر رد: أحمد النجار
  تشغيل برنامجك كمدير (administration) عند العميل برمجيا على ويندوز 7 Omar Mekkawy 5 1,810 05-01-14, 03:08 AM
آخر رد: mero5000
  الصورة العربية - لآ مشقة بعد الآن في إنشاء الدروس ! RaggiTech 2 776 25-04-13, 12:22 PM
آخر رد: خليل اسماعيل
  رسم الباركود برمجيا باستخدام (Code128) RaggiTech 3 2,650 06-10-12, 12:51 AM
آخر رد: RaggiTech
  كيف تقوم بإضافة إجراءاتك الخاصة إلى مجال الأسماء My- توسيع مجال الأسماء My في VB2005 RaggiTech 0 309 05-10-12, 01:49 AM
آخر رد: RaggiTech
  توسيع مجال الأسماء My باستخدام My Extensibility RaggiTech 5 768 03-10-12, 12:26 PM
آخر رد: RaggiTech
  تشغيل برنامجك كمدير (administration) عند العميل برمجيا على ويندوز 7 RaggiTech 0 410 03-10-12, 08:47 AM
آخر رد: RaggiTech
  انشاء odbc برمجيا RaggiTech 0 295 03-10-12, 01:08 AM
آخر رد: RaggiTech
  إدخال وإخراج الأقراص القابلة للنزع برمجيا- Eject-Load Removable Media in VB .net RaggiTech 0 477 01-10-12, 11:47 PM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم