使用mb_str_split(PHP 7.4+)或mb_substr循环(低版本)可正确将中文字符串转为数组,因多字节字符需用mb_*函数按字符而非字节处理,避免乱码。

在PHP中,将包含中文字符的字符串正确地转换为数组,核心在于理解多字节字符编码(如UTF-8),并使用PHP提供的多字节字符串函数。简单来说,你需要避免直接使用按字节分割的函数,转而采用能识别完整字符的函数,比如
mb_str_split
mb_substr
处理中文字符串转数组,最直接且推荐的方法是使用PHP的多字节字符串函数。
PHP 7.4 及以上版本:使用 mb_str_split
这是最优雅的解决方案。
mb_str_split
立即学习“PHP免费学习笔记(深入)”;
<?php $chineseString = "你好,世界!PHP真棒。"; $charArray = mb_str_split($chineseString); print_r($charArray); // 输出会是: // Array // ( // [0] => 你 // [1] => 好 // [2] => , // [3] => 世 // [4] => 界 // [5] => ! // [6] => P // [7] => H // [8] => P // [9] => 真 // [10] => 棒 // [11] => 。 // ) ?>
mb_str_split
<?php $chineseString = "你好,世界!PHP真棒。"; $chunkedArray = mb_str_split($chineseString, 2); // 每两个字符分割 print_r($chunkedArray); // 输出会是: // Array // ( // [0] => 你好 // [1] => ,世 // [2] => 界! // [3] => PH // [4] => P真 // [5] => 棒。 // ) ?>
PHP 7.3 及以下版本:使用 mb_substr
如果你的PHP版本低于7.4,
mb_str_split
mb_strlen
mb_substr
<?php
$chineseString = "你好,世界!PHP真棒。";
$charArray = [];
$length = mb_strlen($chineseString, 'UTF-8'); // 确保指定编码
for ($i = 0; $i < $length; $i++) {
$charArray[] = mb_substr($chineseString, $i, 1, 'UTF-8');
}
print_r($charArray);
// 同样会得到每个字符组成的数组
?>请注意,
mb_strlen
mb_substr
'UTF-8'
str_split
这事儿听起来简单,但实际操作起来,如果对字符编码没点概念,坑还真不少。当我们在PHP中处理包含中文字符的字符串时,直接使用像
str_split()
str_split()
想象一下,一个英文字符(比如'A')在UTF-8编码下通常只占用一个字节。所以,你用
str_split()
['A', 'B', 'C']
str_split()
这就是为什么处理多字节字符集(如UTF-8)时,我们必须使用
mb_*
mb_str_split
mb_strlen
mb_substr
对于PHP 7.4以下的版本,由于没有内置的
mb_str_split
mb_*
mb_strlen
mb_substr
我个人在遇到这种场景时,通常会这样写:
<?php
// 假设这是你的目标字符串
$chineseString = "风急天高猿啸哀,渚清沙白鸟飞回。";
$charArray = [];
// 确保指定编码,通常是UTF-8
$encoding = 'UTF-8';
// 获取字符串的字符长度,而不是字节长度
$length = mb_strlen($chineseString, $encoding);
// 循环截取每个字符
for ($i = 0; $i < $length; $i++) {
// mb_substr(string $string, int $start, ?int $length = null, ?string $encoding = null): string
// 从当前位置 $i 开始,截取长度为 1 的子字符串
$charArray[] = mb_substr($chineseString, $i, 1, $encoding);
}
print_r($charArray);
/* 预期输出:
Array
(
[0] => 风
[1] => 急
[2] => 天
[3] => 高
[4] => 猿
[5] => 啸
[6] => 哀
[7] => ,
[8] => 渚
[9] => 清
[10] => 沙
[11] => 白
[12] => 鸟
[13] => 飞
[14] => 回
[15] => 。
)
*/
?>这个方法虽然多了一步循环,但它在功能上与
mb_str_split
mb_*
mb_internal_encoding
mb_internal_encoding
mb_*
很多时候,我们编写代码时可能忘记在
mb_strlen
mb_substr
mb_internal_encoding
UTF-8
mb_*
UTF-8
举个例子,如果你的
mb_internal_encoding
ISO-8859-1
mb_strlen($string)
mb_substr
如何设置?
通常,你可以在你的
php.ini
; php.ini mbstring.internal_encoding = UTF-8
或者,在你的PHP脚本的入口文件(比如
index.php
mb_internal_encoding()
<?php
mb_internal_encoding("UTF-8");
// 之后所有的mb_*函数,如果未指定编码,都会默认使用UTF-8
$chineseString = "你好,世界!";
echo mb_strlen($chineseString); // 会正确输出 6
?>我个人习惯是在项目启动时,就在入口文件顶部设置好
mb_internal_encoding("UTF-8")mb_*
以上就是字符串包含中文时如何正确转为数组?PHP中文处理方法的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号