首先,我想说我已经阅读了关于 PHP 的 mb_detect_encoding 的另一篇文章, 位于 PHP 中 mb_detect_order() 的奇怪行为。这肯定会再次确认我会通过跟踪和错误学到什么。但是仍然有一些事情让我感到困惑。
我正在构建一个主要是英文网站的 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 之间的字符集。是否有可能以使我获得最低排名的方式检测字符串?(IE。
$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');
这让我很困惑!
唷,有人可以对此有所了解吗?非常感谢!