Я пытаюсь понять логику двух функций 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, но в этой строке используется следующий допустимый байт символа, а не ведущий байт для последовательности.