كيف يمكنني تخمين الترميز بشكل أفضل عندما تكون BOM (علامة ترتيب البايت) مفقودة؟

StackOverflow https://stackoverflow.com/questions/373081

سؤال

يجب أن يقرأ برنامجي الملفات التي تستخدم ترميزات مختلفة.قد تكون ANSI أو UTF-8 أو UTF-16 (endian كبير أو صغير).

عندما تكون BOM (علامة ترتيب البايت) موجودة، ليس لدي أي مشكلة.أعرف ما إذا كان الملف هو UTF-8 أو UTF-16 BE أو LE.

أردت أن أفترض أنه في حالة عدم وجود BOM أن الملف كان ANSI.لكنني وجدت أن الملفات التي أتعامل معها غالبًا ما تفتقد قائمة مكونات الصنف (BOM) الخاصة بها.لذلك قد يعني عدم وجود BOM أن الملف هو ANSI أو UTF-8 أو UTF-16 BE أو LE.

عندما لا يحتوي الملف على BOM، ما هي أفضل طريقة لمسح بعض أجزاء الملف وتخمين نوع الترميز بدقة أكبر؟أود أن أكون على مقربة من 100% من الوقت إذا كان الملف ANSI وفي أعلى التسعينات إذا كان بتنسيق UTF.

أنا أبحث عن طريقة خوارزمية عامة لتحديد ذلك.لكنني في الواقع أستخدم Delphi 2009 الذي يعرف Unicode ويحتوي على فئة TEncoding، لذا سيكون هناك شيء محدد لذلك بمثابة مكافأة.


إجابة:

قادتني إجابة ShreevatsaR إلى البحث في Google عن "كاشف الترميز العالمي دلفي" والذي فاجأني بإدراج هذا المنشور في المركز الأول بعد أن بقي على قيد الحياة لمدة 45 دقيقة فقط!هذا هو جوجلبوتينغ سريع!!ومن المدهش أيضًا أن Stackoverflow وصل إلى المركز الأول بهذه السرعة.

الإدخال الثاني في Google كان عبارة عن إدخال مدونة بواسطة Fred Eaker on كشف ترميز الأحرف التي أدرجت الخوارزميات بلغات مختلفة.

لقد وجدت ذكر دلفي في تلك الصفحة، وقادني مباشرة إلى ذلك كاشف مجموعة الأحرف OpenSource ChsDet المجاني في SourceForge مكتوب بلغة دلفي ومبني على مكون Mozilla i18n.

رائع!شكرًا لجميع الذين أجابوا (الجميع +1)، شكرًا لك ShreevatsaR، شكرًا لك مرة أخرى Stackoverflow، لمساعدتي في العثور على إجابتي في أقل من ساعة!

هل كانت مفيدة؟

المحلول

ربما يمكنك استخدام برنامج Python النصي الذي يستخدم شارديت:كاشف الترميز العالمي.إنها إعادة تنفيذ لاكتشاف ترميز الأحرف الذي يستخدمه Firefox، ويستخدمه العديد من التطبيقات المختلفة.روابط مفيدة: كود موزيلا, ورقة ابحاث كان يعتمد على (ومن المفارقات أن متصفح Firefox الخاص بي فشل في اكتشاف تشفير تلك الصفحة بشكل صحيح)، شرح قصير, شرح مفصل.

نصائح أخرى

هنا كيف يفعل المفكرة ذلك

وهناك أيضا كاشف ترميز بايثون العالمي والتي يمكنك التحقق منها.

تخميني هو:

  • أولاً، تحقق مما إذا كان الملف يحتوي على قيم بايت أقل من 32 (باستثناء علامة التبويب/الأسطر الجديدة).إذا كان الأمر كذلك، فلا يمكن أن يكون ANSI أو UTF-8.وهكذا - UTF-16.فقط عليك أن تكتشف النهاية.لهذا ربما ينبغي عليك استخدام بعض الجداول التي تحتوي على رموز أحرف Unicode الصالحة.إذا واجهت رموزًا غير صالحة، فجرّب طريقة endianness الأخرى إذا كانت مناسبة لك.إذا كان أي منهما مناسبًا (أو لا)، فتحقق من أيهما يحتوي على نسبة أكبر من الرموز الأبجدية الرقمية.يمكنك أيضًا تجربة البحث عن فواصل الأسطر وتحديد النهاية منها.بخلاف ذلك، ليس لدي أي أفكار حول كيفية التحقق من endianness.
  • إذا كان الملف لا يحتوي على قيم أقل من 32 (بصرف النظر عن المسافة البيضاء المذكورة)، فمن المحتمل أن يكون ANSI أو UTF-8.حاول تحليله كـ UTF-8 ومعرفة ما إذا كنت قد حصلت على أي أحرف Unicode غير صالحة.إذا قمت بذلك، فمن المحتمل أن يكون ANSI.
  • إذا كنت تتوقع مستندات بتشفيرات غير مفردة البايت أو متعددة البايت غير Unicode غير الإنجليزية، فهذا يعني أنك لم يحالفك الحظ.أفضل شيء يمكنك القيام به هو شيء مثل Internet Explorer الذي يقوم بإنشاء رسم بياني لقيم الأحرف ومقارنته بالرسوم البيانية للغات المعروفة.إنه يعمل في كثير من الأحيان، لكنه يفشل في بعض الأحيان أيضًا.وسيكون عليك أن تمتلك مكتبة كبيرة من الرسوم البيانية للأحرف لكل لغة.

أسكي؟لم يعد هناك نظام تشغيل حديث يستخدم ASCII بعد الآن.تستخدم جميعها رموز 8 بت، على الأقل، مما يعني أنها إما UTF-8 أو ISOLatinX أو WinLatinX أو MacRoman أو Shift-JIS أو أي شيء آخر موجود.

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

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

يوجد رمز للتحقق من صحة أحرف UTF.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top