PHP snippets

Примеры PHP кода

Статистический метод определения кодировки

Принцип основан на статистическом методе. Есть набор символов, которые не встречаются в текстах с кодировками cp1251 (windows-1251), koi8-r и, может быть, еще каких-нибудь :) Если процентное соотношение этих символов в тексте переваливает за какой-то порог, считается, что текст написан в кодировке UTF-8.

class utf8check
{
    static protected $_utfchars;

    static public function is_utf($str)
    {
        if (null === self::$_utfchars) {
            // Массив особых символов
            self::$_utfchars = @unserialize(base64_decode(
                  'YTo0OTp7aTowO3M6MToimCI7aToxO3M6MToigSI7aToyO3M6MToigiI7aTo'
                . 'zO3M6MToiviI7aTo0O3M6MToigCI7aTo1O3M6MToijyI7aTo2O3M6MToivS'
                . 'I7aTo3O3M6MToisCI7aTo4O3M6MToivyI7aTo5O3M6MToivCI7aToxMDtzO'
                . 'jE6IosiO2k6MTE7czoxOiK1IjtpOjEyO3M6MToijSI7aToxMztzOjE6IrIi'
                . 'O2k6MTQ7czoxOiK3IjtpOjE1O3M6MToitCI7aToxNjtzOjE6IociO2k6MTc'
                . '7czoxOiKxIjtpOjE4O3M6MToiuiI7aToxOTtzOjE6IpIiO2k6MjA7czoxOi'
                . 'KDIjtpOjIxO3M6MToioiI7aToyMjtzOjE6IowiO2k6MjM7czoxOiK2IjtpO'
                . 'jI0O3M6MToiiSI7aToyNTtzOjE6Io4iO2k6MjY7czoxOiKgIjtpOjI3O3M6'
                . 'MToinSI7aToyODtzOjE6IogiO2k6Mjk7czoxOiKRIjtpOjMwO3M6MToipiI'
                . '7aTozMTtzOjE6IqciO2k6MzI7czoxOiKVIjtpOjMzO3M6MToikCI7aTozND'
                . 'tzOjE6IoYiO2k6MzU7czoxOiKaIjtpOjM2O3M6MToilCI7aTozNztzOjE6I'
                . 'p4iO2k6Mzg7czoxOiKfIjtpOjM5O3M6MToioSI7aTo0MDtzOjE6IqQiO2k6'
                . 'NDE7czoxOiKlIjtpOjQyO3M6MToinCI7aTo0MztzOjE6IpsiO2k6NDQ7czo'
                . 'xOiKvIjtpOjQ1O3M6MToiqCI7aTo0NjtzOjE6IooiO2k6NDc7czoxOiKWIj'
                . 'tpOjQ4O3M6MToioyI7fQ=='));
        }

        $count = 0;
        for ($i = 0; $i < strlen($str); $i++) {
            if (in_array($str[$i], self::$_utfchars)) {
                $count++;
            }
        }

        return strlen($str) > 0 ? $count / strlen($str) > 0.1 : false;
    }
}