تحديد ترميز النص في PHP بدلاً من mb_detect_encoding

هناك العديد من ترميزات الحروف الأبجدية السيريلية.

عند إنشاء مواقع على الإنترنت ، عادةً ما تستخدم:

  • UTF-8
  • نوافذ 1251
  • KOI8-ص

ترميزات أكثر شعبية:

  • 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 ، ... حرفًا) ، ونحوله إلى ترميز معروف ونحاول تحديد الترميز بواسطة البرنامج النصي. ثم قارن بشكل صحيح أم لا.

هنا هو الجدول الذي يوجد فيه الترميز على اليسار ، وعدد الأحرف التي يتم بها تحديد الترميز في الأعلى ، يوضح الجدول نتيجة الموثوقية في ٪٪
رسائل ->5153060120180270
نوافذ 125199.1398.8398.5499.0499.7399.93100.0
KOI8-ص99.8999.98100.0100.0100.0100.0100.0
ISO-8859-581.7999.2799.98100.0100.0100.0100.0
ibm86699.8199.99100.0100.0100.0100.0100.0
ماك-السيريلية12.7947.4973.4892.1599.3099.94100.0

دقة أسوأ مع Mac Cyrillic ، ستحتاج إلى 60 حرفًا على الأقل لتحديد هذا الترميز بدقة 92.15٪. ترميز Windows-1251 له أيضًا دقة منخفضة جدًا. هذا يرجع إلى حقيقة أن أرقام شخصياتهم في الجداول تتداخل إلى حد كبير.

لحسن الحظ ، لا يتم استخدام تشفير mac-cyrillic و ibm866 لتشفير صفحات الويب.

لنجرب بدونهم:
رسائل ->510153060
نوافذ 125199.4099.6999.8699.97100.0
KOI8-ص99.8999.9899.98100.0100.0
ISO-8859-581.7996.4199.2799.98100.0

دقة التحديد عالية حتى في الجمل القصيرة من 5 إلى 10 أحرف. ولعبارات من 60 حرفًا ، تصل دقة التحديد إلى 100٪. ومع ذلك ، يتم تحديد الترميز بسرعة كبيرة ، على سبيل المثال ، يتم فحص النص الذي يزيد طوله على 1،300،000 حرف سيريلي في 0.00096 ثانية. (على جهاز الكمبيوتر الخاص بي)

وما هي النتائج التي ستظهرها الطريقة الإحصائية الموضحة في m00t :
رسائل ->510153060
نوافذ 125188.7596.6298.4399.90100.0
KOI8-ص85.1595.7197.9699.91100.0
ISO-8859-588.6096.7798.5899.93100.0

كما ترون ، نتائج تحديد الترميز جيدة. سرعة البرنامج عالية ، خاصة في النصوص القصيرة ، في النصوص الضخمة تكون السرعة أقل بكثير. يتم فحص النص الذي يزيد طوله عن 1،300،000 حرف سيريلي في 0.32 ثانية. (على جهاز الكمبيوتر الخاص بي).

استنتاجاتي


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

الطريقة التي تستخدمها متروك لك. من حيث المبدأ ، يمكنك استخدام كليهما مرة واحدة.

Source: https://habr.com/ru/post/ar466113/


All Articles