Validating arabic strings for equality compare

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

الحالة الثانية

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

 
الحالة الثالثة

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

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

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

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


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

الكود


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

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

 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 





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


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 
 
 الدالة النهائية التي تستخدم في مقارنة المدخلات

  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




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

       Dim mohamed1 As String "محمـــــد"
 
       Dim mohamed2 As String "محمـــــــد"

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

   

Comments

Popular posts from this blog

مقدمة الي تشفير الحروف الأبجدية العربية

VB.NET Translucent Control using GDI+

Add Custom Event to a Class in VB.NET