فهم الترميزات

داخليا، إطار عمل.NET بتخزين نص كـ Unicode UTF-16. وحدة ترميز تحويل هذه بيانات النصية إلى تسلسل وحدات البايت. تقوم وحدة فك الترميز بتحويل تسلسل من وحدات بايت إلى هذا التنسيق الداخلي. يصف الترميز القواعد التي تعمل وفقها وحدة فك ترميز أو أداة الترميز. على سبيل المثال، UTF8Encodingوصف فئة قواعد الترميز إلى وفك الترميز من سلسلة من وحدات البايت الذي يمثل نص ك UTF-8. ترميز و فك تشفير يمكن أن تضمين بعض الخطوات للتحقق من الصحة. على سبيل المثال، الفئة UnicodeEncoding تقوم بالتحقق من كل البدائل للتأكد من أنها تكوّن أزواج بديلة صالحة. كل من هذه الفئات ترث من الفئة Encoding.

اختيار ترميز

يعيّن المعيار Unicode نقطة رمز (رقم) لكل حرف في كل برنامج نصي معتمد. تنسيق التحويل Unicode أو (UTF) هو عبارة عن طريقة لترميز نقطة الرمز المذكورة. للحصول على مزيد من المعلومات حول UTFs المعتمدة من قبل الفئات في System.Text ، راجع استخدام الترميز Unicode في Unicode في .NET Framework.

تحديد فئة ترميز

Encoding تعتبر فئة عامة جداً. الفئات المعتمدة التي ترث من Encoding، تسمح للتطبيقات .NET بالعمل مع الترميزات الشائعة التي من المحتمل مواجهتها في التطبيقات القديمة، كما يمكنك تطبيق ترميزات إضافية. ومع ذلك، عندما تكون لديك الفرصة لاختيار ترميز، يكون من المستحسن بشدة استخدام ترميز Unicode، عادةً إما UTF8Encoding أو UnicodeEncoding ( UTF32Encoding يكون مدعم أيضاً). على وجه الخصوص، UTF8Encoding تكون مفضلة عن ASCIIEncoding. إذا كان المحتوى KSCII، يكون الترميزان مماثلين, و لكن UTF8Encoding يمكنه أيضاً تمثيل كل حرف Unicode ، في حين أن ASCIIEncoding يدعم فقط قيم أحرف Unicode بين U+0000 و U+007F. لأن ASCIIEncoding لا يوفر كشف الأخطاء، يكون UTF8Encoding الأفضل أيضاً للأمان.

تم ضبط UTF8Encoding ليكون سريع قدر الإمكان كما يجب أن يكون أسرع من أي ترميز آخر. حتى بالنسبة للمحتوى الذي يكون ASCII بأكمله، تكون العمليات المنفذة بواسطة UTF8Encoding أسرع من العمليات المنفذة بواسطة ASCIIEncoding. يجب أن تفكر في استخدام ASCIIEncoding فقط من أجل تطبيقات قديمة معينة. ومع ذلك، حتى في هذه الحالة، UTF8Encoding قد يظل اختيار أفضل. بافتراض الإعدادات الافتراضية، يمكن أن تحدث السيناريوهات التالية:

  • إذا كان التطبيق الخاص بك يحتوي على محتوى غير ASCII و يقوم بترميزه باستخدام ASCIIEncoding، يكون ترميز كل حرف غير ASCII على أنه علامة استفهام ("؟"). إذا قام التطبيق بعد ذلك بفك ترميز هذه البيانات, يتم فقدان المعلومات.

  • إذا كان التطبيق يحتوي على محتوى غير ASCII و يقوم بترميزه باستخدام UTF8Encoding، يبدو الناتج غير مفهوم إذا تم ترجمته كـ ASCII. ومع ذلك، إذا قام التطبيق بفك ترميز هذه البيانات، تنفذ البيانات رحلة العودة بنجاح.

اختيار استراتيجية احتياطية

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

  1. الاحتياطي الأكثر تناسباً

    عند عدم وجود مطابق تام للأحرف في الترميز/فك الترميز الهدف، يمكن للتطبيق أن يحاول مطابقة هذه الأحرف إلى حرف مشابه.

  2. احتياطي سلسلة الاستبدال

    إذا لم يكن هناك حرف مشابه مناسب, يمكن للتطبيق تحديد سلسلة استبدال.

على سبيل المثال، يمكن للتطبيق استدعاء GetEncoding(1252, 0, 0) (راجع GetEncoding). يحدد هذا الاستدعاء صفحة الترميز اللغوي 1252 (صفحة الترميز اللغوي Windows لللغات الأوروبية الغربية) مع تحديد encoderFallback و decoderFallback إلى صفر. السلوك الافتراضي هو أفضل تعيين مناسب لأحرف Unicode معينة. على سبيل المثال، الحرف الكبير اللاتيني S في دائرة (U + 24C8) يتم تغييره إلى الحرف الكبير اللاتيني S أي (U + 0053) قبل ترميزه، في حين أن الـ "خمسة مرتفعة" (U + 2075) يتم تغييرها إلى رقم خمسة (U + 0035). إذا كان تطبيق ثم فك من تعليمات برمجية 1252 الصفحة مرة أخرى إلى Unicode، الدائرة حول الحرف هو يصبح 5 2 وفقدان 25. قد تكون تحويلات غير ذلك غير بشكل أكبر. على سبيل المثال، علامة ما لا نهاية في Unicode أي (U + 221E) قد يتم تعيينها إلى الرقم ثمانية (U + 0038).

الاستراتيجيات الأكثر ملاءمة تختلف لصفحات الترميز اللغوي المختلفة و لا يتم توثيقها بالتفصيل. على سبيل المثال، في بعض صفحات الترميز اللغوي، الأحرف اللاتينية ذات العرض الكامل يتم تعيينها إلى الأحرف اللاتينية ذات نصف العرض الأكثر شيوعًا. و في بعض صفحات الترميز اللغوي، لا يتم إجراء هذا التعيين.

حتى ضمن استراتيجية "الأكثر ملاءمة" عنيفة، لا يوجد حرف ملائم يمكن تخيله لبعض الأحرف في بعض الترميزات. ل مثال، ideograph اللغة الصينية قد لا يوجد تعيين معقولة إلى 1252 صفحة تعليمات برمجية. في ترتيب هو الحالة، سلسلة استبدال هو المستخدمة. افتراضياً، هذه السلسلة هي علامة استفهام واحدة فقط (U + 003F).

التعيين للأفضل ملاءمة هو السلوك الافتراضي لـ Encoding، و الذي يقوم بترميز بيانات Unicode إلى بيانات صفحة ترميز لغوي و هناك بعض التطبيقات القديمة التي تعتمد على هذا السلوك. و مع ذلك، يجب على معظم التطبيقات الجديدة تجنب سلوك الأفضل ملاءمة لأسباب أمنية. على سبيل المثال، يجب على التطبيقات ألا تضع اسم مجال عبر ترميز "الأفضل ملاءمة".

يجب أن تستخدم التطبيقات الخاصة بك البدائل التالية لتعيين "الأفضل ملاءمة":

  • استخدام ترميزات Unicode فقط ( UTF8Encoding ، و UnicodeEncoding ، و UTF32Encoding) لتجنب مشكلات الرجوع للاحتياطي.

    ملاحظة تنبيهتنبيه

    في حين ان UTF7Encoding يعتبر تقنيًا ترميز Unicode، هو أقل فعالية و أمان من ترميزات أخرى.في بعض الحالات، يمكن أن يتسبب تغيير بت واحد في تغيير جذري في تفسير سلسلة UTF-7 بأكملها.في حالات أخرى، يمكن لسلاسل UTF-7 مختلفة جوهرياً ترميز نفس النص.وبالتالي، يجب ألا يتم استخدام UTF-7 عندما يكون لديك خيار.UTF-8 يُفضل عن UTF-7.

  • استخدام EncoderExceptionFallback و DecoderExceptionFallback ، الذي يقوم بطرح استثناء ( EncoderFallbackException و DecoderFallbackException على الترتيب) إذا لم يتم تعيين الحرف تماماً.

  • دوماً استخدام EncoderReplacementFallback و DecoderReplacementFallback لتعويض سلسلة استبدال إذا لم يتم تعيين حرف تماماً. هذا هو السلوك الافتراضي لـASCIIEncoding. بشكل افتراضي، هذه السلسلة هي علامة استفهام فقط، و لكن يتم توفير أساليب تتيح للتطبيق اختيار سلسلة مختلفة. على الرغم من أن عادةً يكون هذا حرف واحد، هو ليس من المتطلبات. لـ DecoderReplacementFallback ، الذي يتم استخدامه عند تحويل النص إلى Unicode، أحد الأحرف شائعة الاستخدام هو حرف الاستبدال (U + FFFD).

  • استخدم EncoderFallback و/أو DecoderFallback مخصصة لتنفيذ استراتيجية مفضلة. راجع الـ Fallback Encoding Application Sample

و اثنان من الملاحظات الإضافية حول استراتيجيات العودة للاحتياطي للترميز (أو فك الترميز) "الأفضل ملاءمة":

  • "الأفضل ملاءمة" هي غالبًا مسألة ترميز, لا مسألة فك ترميز. هناك عدد قليل جداً من صفحات الترميز اللغوي التي تحتوي على أحرف لا يمكن تعيينها بنجاح إلى Unicode. و بما أن هذه الأحرف لا يتم استخدامها بشكل شائع, تم حذفها من Unicode.

  • لا توجد أية كائنات مسماة معتمدة مقابلة للعودة للأفضل ملاءمة. العودة للاحتياطي الأفضل ملاءمة لكل صفحة ترميز لغوي يكون مميز. إذا كان التطبيق الخاص بك يحتاج إلى التغيير ذهاباً و إياباً بين "الأفضل ملاءمة" و أحد الاحتياطيات الأخرى لكائن Encoding واحد فإنه يجب أن ينسخ الكائن الأفضل ملاءمة الأصلي إلى متغير قبل تعيين أي كائنات احتياطية أخرى. ثم يمكن للتطبيق استرداد الاحتياطي الأكثر ملاءمة عن طريق تعيين هذه القيمة مرة أخرى إلى Encoding.EncoderFallback أو Encoding.DecoderFallback.

راجع أيضًا:

المهام

Fallback Encoding Application Sample

المرجع

Decoding

DecoderFallback

Encoding

EncoderFallback

موارد أخرى

الترميز و الترجمة