根据字节长分割中英文混合字符串
开发原因
钉钉发送工作通知接口中msg(消息内容)参数最长不超过2048个字节
/**
* [分割中英文字符串]
* @param string $str 字符串
* @param int $byte_length 多少字节长进行切割
* @return array
* @author TXX
* @date 2021/08/17 15:53
*/
function byte_str_split($str, $byte_length)
{
$result = [];
$length = 0; // 当前使用字节长
$tmp_str = ''; // 当前字节字符串
for ($i = 0, $l = mb_strlen($str); $i < $l; $i++) {
$char = mb_substr($str, $i, 1);
if (strlen($char) == mb_strlen($char)) {
// 英文字符
$char_length = 1;
$length++;
} else {
// 中文字符 todo 钉钉占用4字节,根据需要定中文字节长度
$char_length = 4;
$length += 4;
}
if ($length> $byte_length) {
// 当前使用字节长>规定字节长时,加入数组并重置字符串与字节长
$result[] = $tmp_str;
$tmp_str = $char;
$length = $char_length;
} else {
$tmp_str .= $char;
}
}
// 将剩余字符串加入数组
if (!empty($tmp_str)) {
$result[] = $tmp_str;
}
return $result;
}