PHP中无str_split函数能正确处理中文,因其按字节切分导致乱码;应使用mb_substr配合循环逐个截取,需显式指定'UTF-8'编码。

PHP 中没有 str_split 函数能正确处理中文字符串,直接使用会导致乱码或截断——因为 str_split 按字节切分,而 UTF-8 编码的中文占 3 字节,强行按单字节拆会破坏字符结构。
用 mb_substr 配合循环逐个截取
这是最稳妥、兼容性好的方式,适用于所有 PHP 版本(5.0+):
- 先用
mb_strlen($str, 'UTF-8')获取真实字符数 - 用
for循环,每次调用mb_substr($str, $i, 1, 'UTF-8')取一个字符 - 注意必须显式指定编码为
'UTF-8',否则在非 UTF-8 环境下仍可能出错
$str = '你好世界';
$chars = [];
for ($i = 0; $i < mb_strlen($str, 'UTF-8'); $i++) {
$chars[] = mb_substr($str, $i, 1, 'UTF-8');
}
// 结果:['你', '好', '世', '界']
用 preg_match_all 匹配 Unicode 字符
利用正则引擎对 UTF-8 的原生支持,一行解决:
- 模式
/./u中的u修饰符启用 UTF-8 模式,确保点号匹配完整 Unicode 字符(包括中文、emoji) - 比循环更简洁,但对超长字符串性能略低(一般场景无感)
$str = 'Hello你好?';
preg_match_all('/./u', $str, $matches);
$chars = $matches[0];
// 结果:['H','e','l','l','o','你','好','?']
自定义 mb_str_split 函数(推荐封装)
把常用逻辑封装成函数,避免重复写,也方便统一维护:
立即学习“PHP免费学习笔记(深入)”;
- 参数支持指定每组字符数(如每 2 字符一组),类似原生
str_split的第二个参数 - 默认按 1 字符切分,自动检测并使用 UTF-8 编码
- 可加入编码检测逻辑(如用
mb_detect_encoding),但建议业务层明确传入编码更可靠
function mb_str_split($str, $split_length = 1, $encoding = 'UTF-8') {
if ($split_length < 1) return [];
$result = [];
$len = mb_strlen($str, $encoding);
for ($i = 0; $i < $len; $i += $split_length) {
$result[] = mb_substr($str, $i, $split_length, $encoding);
}
return $result;
}
// mb_str_split('一二三四', 2) → ['一二', '三四']
避免踩坑的关键细节
很多乱码问题其实源于环境配置或疏忽:
- 确认文件本身是 UTF-8 无 BOM 格式保存(编辑器里检查)
- PHP 脚本开头无需
header('Content-Type: text/html; charset=utf-8')来“修复”字符串处理,那是输出编码,不影响内部操作 - 数据库连接要设好字符集(如 PDO DSN 加
;charset=utf8mb4),但这和字符串拆分无关,别混淆 - 不要用
iconv或utf8_decode/encode中转处理,徒增风险



















