在 PHP 中处理字符串时,如果涉及到中文、日文、韩文等多字节字符,使用常规的字符串函数(如 substr)很容易出现字符截断错误,导致乱码或不完整字符。为了避免这种问题,PHP 提供了多字节字符串扩展 mbstring,其中两个非常实用的函数是 mb_get_info 和 mb_substr。
本文将通过实例,讲解如何结合这两个函数,安全而正确地截取多字节字符串。
mb_get_info() 用于获取当前的多字节环境配置信息。通过它,我们可以知道当前使用的内部编码是什么,从而确保在进行字符串操作时,编码一致。
<?php
$info = mb_get_info();
echo "当前使用的多字节编码是:" . $info['internal_encoding'];
?>
通常,建议在脚本开头明确设置编码,避免默认设置引发问题:
<?php
mb_internal_encoding('UTF-8'); // 设置为 UTF-8
?>
mb_substr() 是 substr() 的多字节版本,用于从字符串中截取指定长度的子串,支持多种字符编码,避免字符被错误地一刀切。
语法如下:
mb_substr(string $string, int $start, ?int $length = null, ?string $encoding = null): string
参数解释:
$string:原始字符串
$start:起始位置(从 0 开始)
$length:可选,截取的长度
$encoding:可选,指定编码(建议明确写出)
假设我们从一段 UTF-8 编码的中文文章中截取前 50 个字符作为摘要:
<?php
mb_internal_encoding('UTF-8'); // 明确指定编码
$article = "PHP 是一种广泛应用的开放源代码的多用途脚本语言,尤其适用于 Web 开发并可嵌入 HTML 中。";
// 截取前 50 个字符
$summary = mb_substr($article, 0, 50);
echo "文章摘要:" . $summary;
?>
输出结果不会乱码,因为 mb_substr 会以字符为单位处理,而不是以字节为单位。
比如用户提交一段评论,我们想在展示列表中只显示前 30 个字符,并提供“阅读全文”链接:
<?php
mb_internal_encoding('UTF-8');
$comment = "这是用户提交的一段非常精彩的评论,我们希望只显示部分内容。";
$preview = mb_substr($comment, 0, 30);
echo $preview . '... <a href="https://gitbox.net/full-comment.php?id=123">阅读全文</a>';
?>
这样做不仅可以避免页面因超长内容变得臃肿,也保障了字符的完整显示。
如果你要处理的是 GBK、BIG5 等其他编码,记得在每个 mb_ 函数中明确指定编码参数。
mb_strlen() 也可以搭配使用,用于判断截取前是否有必要(比如只有 20 字符时,不必截取 30)。
在 HTML 环境中输出截取内容时,还要注意转义,避免 XSS 问题。