Прежде всего я хотел бы сказать, что я прочитал другой пост, касающийся phb's mb_detect_encoding на
Странное поведение mb_detect_order () в PHP . Который определенно подтверждает то, что я изучил бы путем следа и ошибки. однако есть еще несколько вещей, которые меня смущают.
Я создаю html-скребки в основном английских сайтов, которые собирают данные и сохраняют их в формате UTF-8 XML. Я столкнулся с проблемой, когда страница самостоятельно объявляет кодировку 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 = («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');
это сбивает меня с толку!
фу, кто-то может пролить свет на это? спасибо большое оценил!