هناك العديد من ترميزات الحروف الأبجدية السيريلية.
عند إنشاء مواقع على الإنترنت ، عادةً ما تستخدم:
ترميزات أكثر شعبية:
- ISO-8859-5
- ibm866
- ماك-السيريلية
ربما لا تكون هذه هي القائمة بالكامل ، فهذه هي الترميزات التي أواجهها كثيرًا.
في بعض الأحيان يصبح من الضروري تحديد ترميز النص. وفي PHP ، توجد وظيفة لهذا:
mb_detect_encoding
ولكن ، كما كتب
m00t في مقالة
تعريف ترميز النص في PHP - نظرة عامة على الحلول الحالية بالإضافة إلى الدراجة الأخرىباختصار ، إنه لا يعمل.
بعد قراءة مقالات
m00t ، لم أكن مستوحاة من
طريقتها ووجدت هذا الحل:
تحديد ترميز النص في PHP و Pythonكما قال
m00tرموز الأحرف مرة أخرى
لقد اختبرت وظيفة تحديد الترميز بواسطة رموز الحروف ، والرضا لي وأنا استخدمت هذه الوظيفة لبضع سنوات.
لقد قررت مؤخرًا إعادة كتابة المشروع حيث استخدمت هذه الوظيفة ، فقد وجدت حزمة جاهزة على packagist.org
cnpait / detect_encoding ، حيث يتم تحديد الترميز باستخدام طريقة
m00tفي الوقت نفسه ، تم تثبيت الحزمة المحددة أكثر من 1200 مرة ، مما يعني أنه ليس لي وحده أن تنشأ مهمة تحديد ترميز النص بشكل دوري.
أقوم بتثبيت هذه الحزمة وتهدئة ، لكنني قررت "الخلط".
بشكل عام ، قمت بعمل الحزمة الخاصة بي:
onnov / detect-encoding .
كيفية استخدامها هو مكتوب في README.md
سأكتب عن اختباره ومقارنته
بحزمة cnpait / detect_encoding .
منهجية الاختبار
خذ النص الكبير: تولستوي - آنا كارنينا
الإجمالي - 1'701'480 حرفًا
نزيل كل شيء غير ضروري ، نترك فقط الأبجدية السيريلية:
$text = preg_replace('/[^--]/ui', '', $text);
بقي هناك 1'336'252 علامات السيريلية.
في الحلقة ، نأخذ جزءًا من النص (5 ، 15 ، 30 ، ... حرفًا) ، ونحوله إلى ترميز معروف ونحاول تحديد الترميز بواسطة البرنامج النصي. ثم قارن بشكل صحيح أم لا.
هنا هو الجدول الذي يوجد فيه الترميز على اليسار ، وعدد الأحرف التي يتم بها تحديد الترميز في الأعلى ، يوضح الجدول نتيجة الموثوقية في ٪٪
دقة أسوأ مع Mac Cyrillic ، ستحتاج إلى 60 حرفًا على الأقل لتحديد هذا الترميز بدقة 92.15٪. ترميز Windows-1251 له أيضًا دقة منخفضة جدًا. هذا يرجع إلى حقيقة أن أرقام شخصياتهم في الجداول تتداخل إلى حد كبير.
لحسن الحظ ، لا يتم استخدام تشفير mac-cyrillic و ibm866 لتشفير صفحات الويب.
لنجرب بدونهم:
دقة التحديد عالية حتى في الجمل القصيرة من 5 إلى 10 أحرف. ولعبارات من 60 حرفًا ، تصل دقة التحديد إلى 100٪. ومع ذلك ، يتم تحديد الترميز بسرعة كبيرة ، على سبيل المثال ، يتم فحص النص الذي يزيد طوله على 1،300،000 حرف سيريلي في 0.00096 ثانية. (على جهاز الكمبيوتر الخاص بي)
وما هي النتائج التي
ستظهرها الطريقة الإحصائية الموضحة في
m00t :
كما ترون ، نتائج تحديد الترميز جيدة. سرعة البرنامج عالية ، خاصة في النصوص القصيرة ، في النصوص الضخمة تكون السرعة أقل بكثير. يتم فحص النص الذي يزيد طوله عن 1،300،000 حرف سيريلي في 0.32 ثانية. (على جهاز الكمبيوتر الخاص بي).
استنتاجاتي
- كلتا الطريقتين تعطي نتائج جيدة.
- دقة الطرق قريبة.
- سرعة تحديد رموز الأحرف أعلى في النصوص الكبيرة ، ولكن هذا بالكاد ذو أهمية كبيرة ، لأنه من غير المرجح أن يتحقق أي شخص من هذه النصوص الضخمة.
- الطريقة الإحصائية لا تزال لديها القدرة على زيادة دقة تحديد الترميز.
الطريقة التي تستخدمها متروك لك. من حيث المبدأ ، يمكنك استخدام كليهما مرة واحدة.