Прежде всего, я хотел бы сказать, что я прочитал другой пост о mb_detect_encoding php в Странное поведение mb_detect_order() в PHP. Что определенно подтверждает то, что я узнал путем проб и ошибок. однако есть еще несколько вещей, которые меня смущают.
Я создаю html-скребки в основном англоязычных сайтов, которые собирают данные и сохраняют их в XML UTF-8. Я столкнулся с проблемой, когда сама страница объявляет кодировку ISO-8859-1, но содержит символы, уникальные для Windows-1252. в частности, правильная одинарная кавычка (’) 0x92. Насколько я понимаю, windows-1252 является надмножеством iso-8859-1, что наводит меня на мысль, зачем вообще использовать utf8_encode()? почему бы просто не использовать iconv('Windows-1252', 'UTF-8', $str) вместо utf8_encode(), поскольку все, что представлено в iso-8859-1, будет преобразовано, а также символы, уникальные для windows-1252 ( т. е. €‚ƒ' ' "")
Также
$ansi = "€";//euro mark, the code file itself is in ansi
$detected = mb_detect_encoding($ansi, "WINDOWS-1252");// $detected == "Windows-1252"
$detected = mb_detect_encoding('a'.$ansi, "WINDOWS-1252");// $detected == FALSE
$detected = mb_detect_encoding($ansi.'a', "WINDOWS-1252");// $detected == "Windows-1252"
$detected = mb_detect_encoding($ansi.'a', "WINDOWS-1252",TRUE);// $detected == FALSE
почему это происходит? если первый символ в строке не windows-1252, даже если остальная часть есть, он терпит неудачу? Разве такое поведение не делает его довольно бесполезным? насколько различаются iso-8859-1 и windows-1252
другая вещь, которая меня смущала, была, скажем, я хочу обнаружить кодировку между ASCII, ISO-8859-1, windows-1252, UTF-8. Можно ли обнаружить строки таким образом, чтобы получить набор с самым низким рейтингом? (т.е.
$ascii = "123"; // desired detect result == 'ASCII'
$iso = "é".$ascii; // desired detect result == 'ISO-8859-1'
$ansi = "€".$iso; // desired detect result == 'Windows-1252'
$utf8 = file_get_contents('utf8.txt', true);//$utf8 == '你好123é€', desired detect result == 'UTF-8'
мой $detect_order = array('ASCII', 'ISO-8859-1', 'Windows-1252','UTF-8'); Я знаю, что это неверно, так как это дало мне следующие результаты
$ascii == 'ASCII'
$iso == 'ISO-8859-1'
$ansi == 'ISO-8859-1'
$utf8 == 'ISO-8859-1'
почему мой порядок обнаружения ('ASCII', 'ISO-8859-1', 'Windows-1252', 'UTF-8') неверен для того, что я хочу получить?
ближайшее желаемое возвращаемое значение, которое я получил, было
$ascii == 'ASCII'
$iso == 'ISO-8859-1'
$ansi == 'ISO-8859-1'
$utf8 == 'UTF-8'
оба следующих массива mb_detect_order дали мне вышеуказанные значения
$detect_order = array('ASCII', 'UTF-8', 'Windows-1252', 'ISO-8859-1');
$detect_order = array('ASCII', 'UTF-8', 'ISO-8859-1', 'Windows-1252');
это сбивает меня с толку!
фу, может кто-нибудь пролить свет на это? спасибо большое оценил!