مقارنة
النصوص العربية المشكّلة
مؤخرا،
كنت أستخدم دوت نت في برنامج يتعامل مع اللغة العربية معجميا وصرفيا، وفوجئت بأن
بعض وسائل الفئة String مثل StartsWith و EndsWith و IndexOF تعطي نتائج غير متوقعة حينما يحتوي النص على تشكيل.. على سبيل
المثال:
Dim Name = "أحْمد"
MsgBox(Name.StartsWith("أح")) ' False
لو
جربت هذا الكود فستعرض الرسالة القيمة False، مما يعني أن النص "أحْمد" لا يبدأ بالنص
"أح" من وجهة نظر الوسيلة StartsWith!!
ولو
جربت البحث عن النص "أح" باستخدام الوسيلة IndexOf فستعيد لك الرقم -1 مما يعني أنها لم تعير عليه في النص
"أحمد"!!
وقد
أرسلت إلى ميكروسوفت أسأل عن معنى هذا، فكانت إجابتهم أن هذه الوسائل تجري بعض
العمليات اللغوية على النص أثناء المقارنة تبعا للغة المحلية المستخدمة (العربية
هنا)، لهذا فهي تعتبر التشكيل جزءا من الحرف السابق لها.. وهذا معناه أن الحاء
الساكنة "حْ" تعتبر في نظرها حرفا مختلفا عن الحاء بدون تشكيل
"ح"!!
وللتخلص
من هذا الأداء العجيب يمكن اللجوء إلى المعامل الثاني لهذه الوسائل، لطلب استخدام
المقارنة العادية بدون مراعاة حالة الأحرف (حالة الأحرف في العربية ستعني
التشكيل!!)، وذلك بإرسال القيمة StringComparison.OrdinalIgnoreCase إلى هذا المعامل.. والمثال التالي يعمل كالمتوقع:
MsgBox(Name.StartsWith("أح",
StringComparison.OrdinalIgnoreCase)) ' True
ونفس
الأمر ينطبق على EndsWith و IndexOF.
ملحوظة:
قبل
أن تردّ عليّ ميكروسوفت، حللت المشكلة باستخدام دوال فيجوال بيزيك القديمة Left() و Right() و Mid()..
والحقيقة أن هذه الوسائل تستدعي داخليا الوسيلة String.SubString وهي لا تعامل التشكيل أي معاملة خاصة بل تعتبره حرفا عاديا.. لهذا
يمكن كتابة الكود السابق كالتالي:
MsgBox(Left(Name) = "أح") ' True
أو:
MsgBox(Name.SubString(0, 2) = "أح") ' True
ليست هناك تعليقات:
إرسال تعليق
ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.