PHP 中 mb_* 系列函数用于处理多字节字符串,平时比较常用就是字符串截取 mb_substr,可以有效规避中文字符串截取的乱码问题。

mb_substr 的格式为:

mb_substr( string $str, int $start[, int $length = NULL[, string $encoding = mb_internal_encoding()]] ) : string

第4个参数 encoding 为字符编码。如果省略,则使用内部字符编码。

那么,这个“内部字符编码”是什么呢?我们可以通过函数 mb_internal_encoding 设置和获取:

<?php
/* 设置内部字符编码为 UTF-8 */
mb_internal_encoding("UTF-8");

/* 显示当前的内部字符编码*/
echo mb_internal_encoding();
?>

在 PHP5.6 之前的默认编码都是 ISO-8859-1,PHP5.6 之后的才是 UTF-8。

我公司老项目用 PHP5.4,新项目用 PHP7.2,这几天写老项目用 mb_substr 时习惯性的没有指定第4个参数,造成截取后的字符串末尾出现乱码,进而导致 json_encode 执行失败,找了好久才发现问题根源,真是个大坑啊!