2016-10-07 4 views
2

Я пытаюсь понять логику двух функций mb_detect_encoding и mb_check_encoding, но документация оставляет желать лучшего. Начиная с очень простой тест строкиПонимание результатов функций PHP mb_detect_encoding и mb_check_encoding

$string = "\x65\x92"; 

Который является строчная «а», а затем фигурной кавычки при использовании Windows-1252 кодировку.

Я получаю следующие результаты:

mb_detect_encoding($string,"Windows-1252"); //false 
mb_check_encoding($string,"Windows-1252"); //true 
mb_detect_encoding($string,"ISO-8859-1"); //ISO-8859-1 
mb_check_encoding($string,"ISO-8859-1"); //true 
mb_detect_encoding($string,"UTF-8",true); //false 
mb_detect_encoding($string,"UTF-8"); //UTF-8 
mb_check_encoding($string,"UTF-8"); //false 

Я не понимаю, почему detect_encoding дает "ISO-8859-1" для строки, но не "Windows-1252", когда, по словам https://en.wikipedia.org/wiki/ISO/IEC_8859-1 и https://en.wikipedia.org/wiki/Windows-1252 , байт x92 определяется в кодировке символов Windows-1252, но не в ISO-8859-1.

Во-вторых, я не понимаю, как detect_encoding может вернуть false, но check_encoding может возвращать true для одной и той же строки и того же символьного кодирования.

И, наконец, я не понимаю, почему строка может быть обнаружена как UTF-8, строгий режим или нет. Байт x92 является байтом продолжения в UTF-8, но в этой строке используется следующий допустимый байт символа, а не ведущий байт для последовательности.

ответ

0

Ваши примеры хорошо показывают, почему mb_detect_encoding следует использовать экономно, поскольку это не интуитивно, а иногда и логически неправильно. Если он должен быть использован, всегда проходят в strict = true в качестве третьего параметра (так без UTF8 строки не сообщаются, как UTF8.

Это немного надежнее работать mb_check_encoding над массивом требуемых кодировок , в порядке вероятности/приоритета. Например:

$encodings = [ 
    'UTF-8', 
    'Windows-1252', 
    'SJIS', 
    'ISO-8859-1', 
]; 

$encoding = 'UTF-8'; 
$string = 'foo'; 
foreach ($encodings as $encoding) { 
    if (mb_check_encoding($string, $encoding)) { 
     // We'll assume encoding is $encoding since it's valid 
     break; 
    } 
} 

упорядочение зависит от ваших приоритетов, хотя

.

 Смежные вопросы

  • Нет связанных вопросов^_^