← PHP chr()函数:由ASCII码值生成单字节字符教程 PHP convert_cyr_string()函数:Cyrillic 字符集转换方法 →

PHP chunk_split()函数:把字符串按固定长度切分成块

著
原创 2026-10-10 PHP 已有人查阅

一、chunk_split()的定位

chunk_split()把一个字符串按指定的长度切成若干小块,并在每块末尾插入一个结束字符串。返回值是新字符串,原字符串不受影响。

语法:

string chunk_split ( string $string [, int $length = 76 [, string $end = "\r\n" ]] )
参数 说明 是否必填 默认值
string 待切分的字符串 必填 无
length 每块的字节长度 可选 76
end 每块末尾插入的字符串 可选 \r\n

这里有一个关键细节:默认的length是76,默认的end是\r\n。这两个默认值不是随便定的,它们来自MIMEbase64编码规范(RFC2045),规定base64编码后的文本每行不超过76个字符,行尾用CRLF。chunk_split()最初的设计目标就是配合base64_encode()输出符合邮件传输规范的文本。

关键词提示:PHPchunk_split函数、字符串分块、base64换行、length默认76。

二、参数逐个拆解

length参数

length指定每块的字节长度。它按字节计算,不是按字符数。处理多字节字符(中文、emoji)时,一个字符可能占多个字节,切分位置会落在字节边界上,可能把一个多字节字符切断。

<?php
$str = "代码号学习编程";
echo "原始字符串:" . $str . "<br>";
echo "按 3 字节切分:" . chunk_split($str, 3, "|");
?>

输出:

原始字符串:代码号学习编程
按 3 字节切分:代|码|号|学|习|编|程|

UTF-8下每个汉字占3字节,按3字节切分刚好每个汉字成一块,看起来"对上了"。但如果length设成2,就会把某个汉字的3个字节切成2+1,输出会出现乱码。

<?php
$str = "代码号";
echo chunk_split($str, 2, "|");
?>

输出可能出现类似代的字节被截断,显示为乱码字符。处理多字节字符时,chunk_split()不是安全的切分工具,应该用mb_str_split()或preg_split配合u修饰符。

end参数

end指定每块末尾插入什么。它可以是任意字符串,不只是换行。

<?php
$str = "Hello";
echo chunk_split($str, 1, ".");
?>

输出:

H.e.l.l.o.

注意末尾也加了一个.。这是chunk_split()的行为特点:每块后面都追加end,包括之后一块。如果之后一块后面不想要end,需要手动rtrim()或用其他方式处理。

这个"尾巴也带end"的行为,在使用中经常需要额外处理。个人踩坑经历:曾经用chunk_split()生成带分隔符的字符串,之后拿去解析时发现末尾多了一个分隔符,导致数组多出一个空元素。后来养成习惯,用chunk_split()之后跟一个rtrim(result,result,end),把末尾多余的结束符去掉。

三、默认行为与base64场景

不传length和end时,chunk_split()按76字节切分,每块末尾加\r\n。

<?php
$data = base64_encode("这是一段需要编码的文本内容");
echo chunk_split($data);
?>

输出大致形如:

6L+Z5piv5LiA5q61566A6KaB57yW56CB55qE5paH5pys5YaF5a65

(具体内容取决于原文,行尾带CRLF)

这正是配合base64_encode()的标准用法。base64编码后的字符串通常较长,直接输出成一行不利于阅读和传输。chunk_split()把它切成76字符一行,符合邮件、PEM证书等格式的规范。

PEM格式的证书就是典型例子:-----BEGINCERTIFICATE-----和-----ENDCERTIFICATE-----之间的base64内容,每行64个字符。这个64是PEM自己的规范,不是chunk_split()的默认值,需要显式传入。

<?php
$cert = base64_encode("模拟证书二进制数据");
$pem = "-----BEGIN CERTIFICATE-----\r\n";
$pem .= chunk_split($cert, 64, "\r\n");
$pem .= "-----END CERTIFICATE-----";
echo $pem;
?>

这里length用64,end用\r\n,符合PEM的行宽约定。

四、与相关函数的对比

chunk_split()容易和几个函数混淆,理清区别有助于选对工具。

函数 作用 是否保留原串 典型用途
chunk_split() 按长度切分并插入结束符 保留 base64换行、格式化输出
str_split() 按长度切成数组 保留 需要数组形式处理
explode() 按分隔符切分 保留 已知分隔符的场景
wordwrap() 按单词边界折行 保留 文本排版

关键区别:chunk_split()返回字符串,str_split()返回数组。如果后续要对每块做独立处理,str_split()更顺手;如果只是生成带换行的文本,chunk_split()直接给出结果。

str_split()的对照写法:

<?php
$str = "Hello";
print_r(str_split($str, 1));
?>

输出:

Array
(
    [0] => H
    [1] => e
    [2] => l
    [3] => l
    [4] => o
)

得到数组,没有多余的结束符。需要数组时用str_split(),需要字符串时用chunk_split(),这个选择标准比较清晰。

五、项目实战场景

场景一:生成带分隔符的展示字符串

会员、订单号等长数字串,展示时每隔几位加一个分隔符,便于阅读。

<?php
$cardNo = "6222021234567890123";
echo chunk_split($cardNo, 4, " ");
?>

输出:

6222 0212 3456 7890 123 

末尾多了一个空格,实际使用时配合rtrim()清理:

<?php
$cardNo = "6222021234567890123";
echo rtrim(chunk_split($cardNo, 4, " "));
?>

输出:

6222 0212 3456 7890 123

场景二:输出符合规范的base64文本

前面已经说明,这是chunk_split()的原始设计场景。生成邮件正文、证书文件、密钥文件时,用它做行宽控制。

场景三:长串分块传输前的预处理

某些接口对单行长度有限制,需要把长字符串按固定宽度折行后提交。chunk_split()可以快速完成折行,但要注意末尾结束符的处理。

反思:在一个对接老旧接口的项目里,对方要求参数每行不超过80字符。最初直接用chunk_split($data,80,"\n"),提交后对方返回解析错误。排查发现是末尾多了一个换行符,对方的解析器把它当成了空行。chunk_split()的末尾end是默认行为,对接外部系统时一定要确认对方的格式容忍度,不确定就先rtrim()掉再传。

六、本节课程知识要点

  1. chunk_split()按length字节切分字符串,每块末尾插入end。

  2. 默认length为76,end为\r\n,源自MIMEbase64规范。

  3. 返回新字符串,原字符串不变。

  4. 之后一块末尾也会追加end,需要时用rtrim()清理。

  5. length按字节计算,多字节字符可能被切断,中文场景慎用。

  6. 需要数组结果用str_split(),需要字符串结果用chunk_split()。

七、常见问题

Q:chunk_split()会改变原字符串吗?

A:不会。它返回处理后的新字符串,原变量保持原样。

Q:为什么chunk_split($str,1,".")末尾也有点号?

A:每块后面都追加end,包括之后一块。这是设计行为,不是bug。

Q:length传0会怎样?

A:PHP会抛出ValueError(PHP8及以上)或返回false(更早版本)。length必须是大于0的整数。

Q:中文按字符切分怎么做?

A:用mb_str_split()或preg_split('//u',$str,-1,PREG_SPLIT_NO_EMPTY)。chunk_split()按字节切分,不适合多字节字符。

chunk_split()是一个目标明确的字符串格式化函数,按固定长度切块并插入结束符。它的默认参数服务于base64编码的换行需求,理解这一点就能明白76和\r\n的来历。使用时注意三个点:末尾会多一个end,length按字节而非字符计算,返回字符串而非数组。掌握这些边界,再结合rtrim()、str_split()等函数配合,就能在格式化输出、base64处理、长串折行等场景中稳妥使用。

← PHP chr()函数:由ASCII码值生成单字节字符教程 PHP convert_cyr_string()函数:Cyrillic 字符集转换方法 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号