以下示例演示了 `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