Алгоритм определения кодировки.

wwoland

Добрый день.
Видел тут недавно способ определения кодировки вот такой
 
function detect_encoding($string) {
static $list = array('utf-8', 'windows-1251');

foreach ($list as $item) {
$sample = iconv($item, $item, $string);
if (md5($sample) == md5($string
return $item;
}
return null;
}

Не ругайте за ПХП, просто мне его в таком виде показали.
Так вот, я его попробовал, правда использовал шел и утилиты iconv и md5sum, так у меня этот алгоритм как-то не особо сработал.
Ну и на мой не самый просвещенный взгляд, он и не должен работать в большинстве случаев.
Точнее так, на мой взгляд, хеш не будет равен только в том случае, если в строка не в проверяемой кодировке и каких-то ее байтов/сочетаний байтов физически не может быть в проверяемой кодировке, тогда просто будет что-то типа исключения, а в остальных случаях хеш должен совпадать.
Подскажите, пожалуйста, где я заблуждаюсь, если я заблуждаюсь. Или может я чего-то не знаю про php и его реализацию iconv и md5?
Спасибо.
ПС. Если вопрос плохо сформулирован, буду рад в помощи по переформулировке :)

Serab

имхо, ты прав, как-то волосы дыбом становятся от такой функции :)

AlexV769

Я когда-то написал подобную функцию:
        $nstring = NULL;
foreach(array("UTF-8", "Windows-1251") as $encoding){
if(!mb_check_encoding($string, $encoding{
continue;
}
$nstring = mb_convert_encoding($string, "UTF-8", $encoding);
if(strlen($nstring{
break;
}
}
return $nstring;

Dasar

Точнее так, на мой взгляд, хеш не будет равен только в том случае, если в строка не в проверяемой кодировке и каких-то ее байтов/сочетаний байтов физически не может быть в проверяемой кодировке, тогда просто будет что-то типа исключения, а в остальных случаях хеш должен совпадать.
примерно так оно и есть (будет исключение, символ будет пропущен или заменен на предопределенный символ зависит от реализации в данном языке и настроек)
В данном куске кода лишь делается выбор: скорее utf-8 или скорее win-1251. И выбор делается на основе простой эвристики: попробовали прочитать в utf-8, если при этом прочитались невалидные символы, то значит это кодировка 1251, а не utf8

katrin2201

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

Serab

php радиоактивный язык походу :grin:

vall

От пхп волосы на клавиатуре растут. //Вчерашний ЛОР
Оставить комментарий
Имя или ник:
Комментарий: