gpt4 book ai didi

php mb_detect_encoding()

转载 作者:可可西里 更新时间:2023-10-31 23:50:02 26 4
gpt4 key购买 nike

首先我想说我已经阅读了另一篇关于 php 的 mb_detect_encoding 的帖子 Strange behaviour of mb_detect_order() in PHP .这肯定再次确认了我通过试错所学到的东西。然而,仍有一些事情让我感到困惑。

我正在构建一个主要是英文网站的 html 抓取工具,用于收集数据并将其存储为 UTF-8 XML。我遇到了一个页面 self 声明 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');

这让我很困惑!

哇,有人可以解释一下吗?非常感谢!

最佳答案

这是一个known bug .

Windows-1251Windows-1252 只有在整个字符串由一定范围内的高字节字符组成。这意味着你永远不会得到正确的转换,因为文本将显示为ISO-8859-1 即使是 Windows-1252

我在从 LATIN1 转换为 UTF-8 时遇到了这个问题。我从 Microsoft Word 粘贴了许多内容,并使用 MySQL 表的 LATIN1 字符集存储在 VARCHAR 字段中。正如您可能知道的那样,Word 将撇号和引号转换为智能撇号和弯引号。它们都不会显示在屏幕上,因为这些字符没有正确转换。文本始终被标识为 ISO-8859-1。为了解决这个问题,我强制将 Windows-1252 转换为 UTF-8,并且撇号和引号(以及其他字符)都已正确转换。

关于php mb_detect_encoding(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8168344/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com