نموذج ترميز متعدد اللغات

السؤال

ما أفضل وسيلة للتعامل مع مشكلات الترميز في نماذج قد تستخدم لغات ونصوصًا متعددة؟

الإجابة

أفضل وسيلة للتعامل مع مشكلات الترميز في نماذج (X)HTML هي تقديم جميع صفحاتك في UTF-8. حيث يمكن لـ UTF-8 تمثيل حروف مجموعة كبيرة من اللغات. وتقوم برامج التصفح بإرسال بيانات النموذج بنفس نظام التشفير مثل الصفحة الحاوية للنموذج، بحيث يمكن للمستخدم ملء البيانات بأى لغة ونص تحتاجها.

وهناك تفاصيل قليلة للتأكد من أن تلك المعالجة تعمل بصورة جيدة. أولاً، من المهم أن تحدد للمتصفح أن صفحة النموذج تستخدم UTF-8. وهناك طرق شتى لـ إخبار المتصفح عن ترميز صفحتك. وهذا الأمر مهم على أي حال، ولكنه أكثر أهمية في حالة عدم احتواء صفحة النموذج ذاتها على أي حروف أخرى غير US-ASCII، ولكن قد يكتب مستخدموك بحروف أخرى.

ثانيًا، قد تكون فكرة جيدة بالنسبة للنص الذي يستقبل بيانات النموذج أن يتأكد من أن البيانات المرتدة تستخدم UTF-8 بالفعل (في حالة حدوث خطأ ما، على سبيل المثال قيام المستخدم بتغيير الترميز). إمكانية التحقق بسبب احتواء UTF-8 على نمط بايت محدد للغاية لا يُرى في أى نظام ترميز آخر. في حالة استلام بيانات أخرى غير UTF-8، ينبغي إرسال رسالة خطأ.

على سبيل المثال، في لغة Perl، قد يظهر اختبار تعبير مُعتاد لـ UTF-8 كما يلي:

$field =~
  /\A(
     [\x00-\x7F]            # ASCII
   | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
   |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
   | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
   |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
   |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
   | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
   |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
  )*\z/x;

يمكن تهيئة هذا التعبير بحيث يكون مناسبًا لأي لغات برمجة أخرى. فهي تهتم بموضوعات متنوعة، مثل الترميز غير القانوني، والاستخدام غير القانوني للبدائل. وتعود إلى الحالة صواب في حالة ما إذا كانت $field هي UTF-8، وتكون في الحالة خطأ إذا كان الأمر غير كذلك.

The above regular expression can be tailored by adding application-related restrictions. As an example, many control characters can be excluded by replacing [\x00-\x7F] with [\x09\x0A\x0D\x20-\x7E]