推荐用 mb_strcut() 而非 substr(),因其按字节截取但识别多字节字符边界,避免 UTF-8 中文乱码;substr() 直接按字节切易截断字符中间导致乱码。

PHP 截取数据库字段过长内容,推荐用 mb_strcut(),它按字节截取但保证不破坏多字节字符(如中文),比 substr() 更安全。
为什么用 mb_strcut 而不是 substr?
substr() 按字节截取,对 UTF-8 中文可能切在中间,导致乱码;mb_strcut() 识别字符边界,自动停在合法字符末尾,适合处理中文、日文等多字节文本。
mb_strcut 基本用法
语法:mb_strcut(string $str, int $start, ?int $length = null, string $encoding = mb_internal_encoding())
- $str:要截取的字符串(比如从数据库查出的字段值)
- $start:起始位置(字节偏移,不是字符数)
- $length:截取长度(字节数),省略则截到末尾
-
$encoding:编码格式,常用
'UTF-8',建议显式传入
实战示例:截取标题前30个字符(显示用)
假设数据库字段是 UTF-8 编码的标题,想安全截成最多 30 个“字符”显示(注意:这里指视觉字符数,不是字节数):
✅ 正确做法(按字符数估算字节数 + 安全截断):
$title = $row['title']; // 如:"PHP中使用mb_strcut截取长文本的正确方式"
$limit_chars = 30;
// 先用 mb_substr 获取前30字符(更直观),再用 mb_strcut 防止超长字节
$truncated = mb_substr($title, 0, $limit_chars, 'UTF-8');
if (mb_strlen($title, 'UTF-8') > $limit_chars) {
$truncated .= '…';
}
⚠️ 注意:mb_strcut() 的 $length 参数是字节数,不是字符数。若硬要用它控制“最多30字符”,需先估算最大字节长度(UTF-8 中一个汉字最多 3 字节 → 30×3=90 字节),再截取:
SUBSTR()
- 查询时不要依赖 SQL 截取中文字段(尤其需要精确字符数时)
- 取出完整字段后,在 PHP 用
mb_substr()(推荐)或mb_strcut()处理 - 如果必须用
mb_strcut(),记得始终传入'UTF-8'编码参数,避免依赖内部编码设置
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











