根本原因是explode()按字节切分而中文为多字节字符,易劈开汉字导致乱码;应使用mb_explode()、preg_split('/|/u')或先转utf-8再处理。

PHP 中用 explode() 分割含中文的字符串时出现乱码,根本原因在于它按字节切分,而 UTF-8 或 GBK 中文是多字节字符。当分隔符(如 |、,)的某个字节恰好落在中文字符的中间,就会把一个汉字“劈开”,造成乱码和空元素。
避免用 explode 处理中文分隔场景
explode 是纯字节函数,不识别字符编码。哪怕字符串本身是合法 UTF-8,只要分隔符字节与中文编码重叠(比如 GBK 下“弢”字编码为 8f7c,而 | 的 ASCII 是 7c),就可能误判为分隔位置。
- 不要对含中文的字符串直接使用
explode('|', $str) - 尤其避免在 GBK/GB18030 编码环境下用单字节分隔符
- 即使 UTF-8 下看似正常,也存在边界风险(如 emoji、生僻字)
推荐用 mb_strpos + mb_substr 手动实现 mb_explode
这是最稳妥、兼容性最好的方式,能真正按字符位置操作,完全避开字节陷阱。
示例函数:
function mb_explode($delimiter, $string, $encoding = null) {
$encoding = $encoding ?: mb_internal_encoding();
$result = [];
$offset = 0;
while (($pos = mb_strpos($string, $delimiter, $offset, $encoding)) !== false) {
$result[] = mb_substr($string, $offset, $pos - $offset, $encoding);
$offset = $pos + mb_strlen($delimiter, $encoding);
}
$result[] = mb_substr($string, $offset, null, $encoding);
return $result;
}
// 使用:
$arr = mb_explode('|', '张三|李四|王五'); // 全角竖线也可安全分割
?>
用 preg_split 配合 Unicode 模式(UTF-8 环境)
如果确定脚本运行在 UTF-8 环境下,可用正则替代,但必须加 u 修饰符启用 Unicode 模式。
-
preg_split('/\|/u', $str)—— 安全分割竖线(|) -
preg_split('/[,,、]/u', $str)—— 同时支持英文逗号和中文顿号 - 加上
PREG_SPLIT_NO_EMPTY可自动过滤空项
注意:preg_split 在 GBK 环境中无法正确处理 Unicode 模式,此时仍需优先选 mb_ 方案。
预处理:统一转 UTF-8 再操作
若原始数据来自 GBK 文件或旧系统,先转换编码再分割,可大幅降低风险。
$str_utf8 = mb_convert_encoding($str, 'UTF-8', 'GBK');- 再用
mb_explode()或preg_split('/\|/u', ...) - 确保
mb_internal_encoding()已设为'UTF-8'
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











