slo_nik
@slo_nik

Как правильно угадать кодировку символов в файле?

Добрый день.
На сайте надо реализовать определение кодировки простого текстового файла.
Сейчас это реализовано простейшим способом.
$filecontent = file_get_contents($path . '/' . $this->filename);
 $c = mb_detect_encoding($filecontent, 'cp1251, UTF-8');
 if($c == 'Windows-1251'){
     $filecontent = iconv('Windows-1251', 'UTF-8', $filecontent);
}


Но если файл в другой кодировке, отличной от widnows-1251, то mb_detect_encoding() не всегда определяет точно, в какой именно кодировке файл.

Как в этом случае можно определить точно кодировку, чтобы привести её к UTF-8?
Например, файл может быть в windows-1252 или utf-16 или ещё какой либо.

Расчёт ведётся на пользователя, который ничего не знает о кодировках и не заморачивается настройкой кодировки в системе и блокноте. Он пишет текст в той кодировке какая есть, но на сайте, перед записью в базу, надо определить в какой именно и корректно показать модератору этот текст в текстовой области.

p.s. При таком решении, что я показал выше, если текст начинается с цифры, то остальной текст просто не выводится, если кодировка отлична от cp-1251.
  • Вопрос задан
  • 4051 просмотр
Решения вопроса 1
Для кириллицы можно примерно такой алгоритм:

1. Задетектить UTF-16
обычно в начале текста присутствует Unicode-признак порядка U+FEFF, по нему можно отличить big endian / little endian.

Если признака нет, но в четных позициях текста (начиная с нуля) в основном символы с кодом 0x00 (для латиницы) и 0x04 (для кириллицы) - то это UTF-16 big endian, если в нечетных - little endian.

2. Задетектить UTF-8
все кириллические символы будут состоять из двух октетов, первый октет будет иметь значение 0xd0 или 0xd1, латиница будет совпадать с ASCII

3. Отличить Windows-1251 от KOI8-r - и там и там для кириллицы используют в основном символы с кодом 192-255, но в koi8-r сначала идут маленькие символы, в windows-1251 - сначала большие. Если текст преимущественно состоит из символов 192-223 но в начале предложения (после точки с пробелом) идут символы с кодом 224-255 - это ko8-r, если наоборот - windows-1251 + можно использовать частотный анализ символов. Латиница совпадает с ASCII.

Все остальные кодировки достаточно редки, правда китайцы (и почему-то Google) любят кодировать кириллицу в Big-5.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы