gpt4 book ai didi

PHP 函数 mb_detect_encoding 严格模式

转载 作者:可可西里 更新时间:2023-11-01 13:23:56 24 4
gpt4 key购买 nike

在函数中mb_detect_encoding严格模式有一个参数。

在第一个最赞的评论中:

<?php
$str = 'áéóú'; // ISO-8859-1
mb_detect_encoding($str, 'UTF-8'); // 'UTF-8'
mb_detect_encoding($str, 'UTF-8', true); // false

这是真的,是的。但是谁能给我一个解释,这是为什么?

最佳答案

此答案中的所有内容均基于我对代码 here 的阅读和 here .

我没有写它,我没有用调试器单步调试它,这只是我的解释。


似乎意图是针对严格模式检查字符串作为一个整体是否对编码有效,而非严格模式将允许可能的子序列是有效字符串的一部分。 例如,如果字符串以多字节字符的第一个字节结尾,它在严格模式下将不匹配,但在非严格模式下仍符合 UTF-8 标准模式。

但是似乎存在一个错误*,即在非严格模式下,在某些情况下仅检查字符串的第一个字节。

示例:

字节 0xf8 在 UTF-8 中的任何地方都不允许。当放在字符串的开头时,无论使用哪种模式,mb_detect_encoding() 都会正确返回 false。

$str = "\xf8foo";

var_dump(
mb_detect_encoding($str, 'UTF-8'), // bool(false)
mb_detect_encoding($str, 'UTF-8', true) // bool(false)
);

但只要前导字节可能出现在 UTF-8 序列中的任何位置,非严格模式就返回 UTF-8。

$str = "foo\xf8";

var_dump(
mb_detect_encoding($str, 'UTF-8'), // string(5) "UTF-8"
mb_detect_encoding($str, 'UTF-8', true) // bool(false)
);

因此,虽然您的 ISO-8859-1 字符串 'áéóú' 不是有效的 UTF-8,但第一个字节 "\xe1" 可以出现在 UTF-8 中,并且mb_detect_encoding() 错误地返回字符串。


*我已经在 https://bugs.php.net/bug.php?id=72933 打开了一份报告

关于PHP 函数 mb_detect_encoding 严格模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39117203/

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