mb_strcut 函数的作用是从多字节字符串中截取指定字节长度的字符串片段。它和 mb_substr 类似,但不同的是 mb_strcut 是以字节数为单位截取,而不是字符数。
<?php
$str = "这是一个测试字符串";
echo mb_strcut($str, 0, 6, "UTF-8"); // 输出“这是一”
?>
这里 6 是字节数(UTF-8 编码下,一个汉字通常占3个字节),所以实际截取了前两个汉字。
特殊字符指的可以是诸如表情符号(emoji)、特殊符号、组合字符(如带变音符的字母)等。这些字符在 UTF-8 中往往占用多于 3 个字节,甚至可能占用4个或更多字节。
因为 mb_strcut 是基于字节数截取,若截取长度刚好截断了一个多字节字符的一部分,就会导致截断后的字符串出现乱码或者不完整字符。
示例:
<?php
$str = "Hello ?? World";
echo mb_strcut($str, 0, 8, "UTF-8"); // 可能输出“Hello ”后跟乱码
?>
这里的 ?? 是一个 emoji,占用4个字节,如果截取长度落在了 emoji 字节中间,就会截断字符,导致乱码。
PHP 的 mb_strcut 从 PHP 7.0 起,mbstring 扩展对4字节字符支持较好,但仍然需要注意截取长度和字符边界。
mb_substr 按字符截取,不会截断半个多字节字符,避免乱码。
<?php
$str = "Hello ?? World";
echo mb_substr($str, 0, 7, "UTF-8"); // 输出“Hello ??”
?>
如果一定要用 mb_strcut,建议手动检测截取点是否为完整字符边界,或者先用 mb_strlen 获取字符数,再计算对应字节数。
mb_strcut 是处理多字节字符串时很强大的工具,但由于它按字节截取,遇到特殊字符(特别是4字节 emoji)时可能会产生乱码或截断异常。理解字节与字符的区别,合理选择 mb_strcut 或 mb_substr,并确保字符编码一致,是避免问题的关键。