以下是一个演示 `substr` 和 `mb_substr` 函数之间区别的示例
1- 当处理非 UTF-8 字符时,这两个函数的行为相同,并给出相同的输出
$str = 'abcdef';
echo substr($s, 0, 3); // abc
echo mb_substr($s, 0, 3); // abc
2- 当处理 UTF-8 字符时,每个函数的行为将不同,并给出不同的结果
2.A- 'substr' 函数在字节级工作,并且仅适用于单字节编码字符(不支持多字节编码)。
例如
$str_utf8 = utf8_encode("déjà_vu");
如果我们这样做
echo substr($str_utf8, 0, 3); // dé
echo substr($str_utf8, 0, 2); // d�
=> 这是因为特殊字符“é”(和“à”)在内部用两个字节编码
PHP 将从索引 0 开始读取第一个字节,它表示 `d`,然后移动到第二个字节,它是字符 ` é ` 的双字节编码的一部分,并且由于长度设置为 2,PHP 将在此停止并且不会继续读取第三个字节,因此它无法识别字符 ` é ` 并打印 � 而不是 é。
2.B- 'mb_substr' 函数在字符级工作,并支持多字节编码字符。这意味着,PHP 只计算字符数量,而不考虑其编码的字节数,例如
$str_utf8 = utf8_encode("déjà_vu");
echo mb_substr($str_utf8, 0, 4, "UTF-8"); // Déjà
echo mb_substr($str_utf8, 1, 4, "UTF-8"); // éjà_
echo mb_substr($str_utf8, 6, 4, "UTF-8"); // u
echo mb_substr($str_utf8, 7, 4, "UTF-8"); // ''
echo mb_substr($str_utf8, -2, "UTF-8"); // vu
echo mb_substr($str_utf8, -2, 1, "UTF-8"); // v
echo mb_substr($str_utf8, -2, 3, "UTF-8"); // vu