如何将字符串按指定长度分割(多字节安全)?

来源:百度文库 编辑:神马文学网 时间:2024/04/29 17:36:34
Posted by: ameliorate 2006-07-12 11:37
CODE
$split_length = 268;
$string = <<持有太平洋卡的客户可以在全国140个城市的3200家交通银行网点享受
异地存取款、转账的轻松和便利,同时交通银行的自助设备将为您提供
24小时快捷服务。持有太平洋卡的客户可以在全国140个城市的3200家
交通银行网点享受异地存取款、转账的轻松和便利,同时交通银行的自
助设备将为您提供24小时快捷服务。
EOT; // 以上字符不换行(为浏览方便,手动换行)
mb_internal_encoding(‘gbk‘);
$res = str_split($string, 40);
print_r($res);
?>
输出:
mb_split()要用到正则,偶正则不熟 :(
CODE
Array
(
[0] => 持有太平洋卡的客户可以在全国140个城市的3
[1] => 200家交通银行网点享受异地存取款、转账的?
[2] => 崴珊捅憷苯煌ㄒ械淖灾璞附
[3] => 峁?4小时快捷服务。持有太平洋卡的客户可?
[4] => 栽谌?40个城市的3200家交通银行网点享受
[5] => 异地存取款、转账的轻松和便利,同时交通银
[6] => 行的自助设备将为您提供24小时快捷服务。
)
Posted by: Dalamar 2006-07-12 11:46
算ascii码,超过127的,前或者后多给一位
Posted by: ameliorate 2006-07-12 11:48
QUOTE (Dalamar @ 2006-07-12 11:46)
算ascii码,超过127的,前或者后多给一位
没有更方便的办法吗?
Posted by: aDang 2006-07-12 13:43
mb_ 开头的一串函数
很好用
Posted by: ameliorate 2006-07-12 14:54
QUOTE (aDang @ 2006-07-12 13:43)
mb_ 开头的一串函数
很好用
不要这么笼统啊。PHP手册中的 mb_* 函数我都看过啦,没有类似 str_split() 功能的函数。
如果依托 mb_strcut() 写一个 mb_str_split(),要考虑到好多细节问题。
过程如下(每次截取36字节,每个汉字为2字节):
1、截取由位置 0 起始的 36 个字节;
2、考虑截取 36 个字节后,下一个起始位置是 35 还是 36(也就是说,第一次实际上截取了35个字节还是36个字节)?
3、考虑到每次实际截取的字节数可能不是 36 的整数倍,那么究竟应截取多少次(ceil($string_length/$split_length)是不可靠的)?
4、如果用ASCII码>127也有部分生僻字会出现问题。
5、扩展为 UTF-8 编码,还要考虑每个汉字是3个字节。
Posted by: nio 2006-07-12 15:36
QUOTE (ameliorate @ 2006-07-12 14:54)
QUOTE (aDang @ 2006-07-12 13:43)
mb_ 开头的一串函数
很好用
不要这么笼统啊。PHP手册中的 mb_* 函数我都看过啦,没有类似 str_split() 功能的函数。
如果依托 mb_strcut() 写一个 mb_str_split(),要考虑到好多细节问题。
过程如下(每次截取36字节,每个汉字为2字节):
1、截取由位置 0 起始的 36 个字节;
2、考虑截取 36 个字节后,下一个起始位置是 35 还是 36(也就是说,第一次实际上截取了35个字节还是36个字节)?
3、考虑到每次实际截取的字节数可能不是 36 的整数倍,那么究竟应截取多少次(ceil($string_length/$split_length)是不可靠的)?
4、如果用ASCII码>127也有部分生僻字会出现问题。
5、扩展为 UTF-8 编码,还要考虑每个汉字是3个字节。
看来你还是没有仔细看,有个 mb_substr() 的函数也许对你有帮助
Posted by: ameliorate 2006-07-12 15:37
已解决。
CODE
/**
* 按指定长度分割字符串为数组(多字节安全)
*
*/
function mb_str_split($string, $split_length, $encoding = ‘gbk‘) {
// 设置字符集编码
mb_internal_encoding($encoding);
// 初始化截取偏移量
$offset = 0;
// 如果剩余的字符串的长度大于零
while (strlen($string)) {
// 截取到的字符串
$mb_strcut = mb_strcut($string, 0, $split_length);
// 截取到的字符串的长度
$offset = strlen($mb_strcut);
// 剩余的字符串
$string = mb_strcut($string, $offset);
// 返回一个数组元素
$return[] = $mb_strcut;
}
// 返回一个值
return $return;
}
?>
Posted by: aDang 2006-07-12 15:45
在MBString库里面,不用去关心字节的问题
mb_strimwidth() 截取你想要的宽度,比如40个半角英文的宽度
mb_strlen() 计算一下截出来了多少个字符
mb_substr() 从原字符串里面把截出来的字符删掉
设置好了字符集,mb函数操作的一切,都是整个字符,比如‘a‘是一个字符,‘中‘也是一个字符
不需要自己去计算什么编码方式下多少个字节表示一个字符
Posted by: ameliorate 2006-07-12 15:53
感谢 aDang、Dalamar、nio 的热心帮助(按拼音字母排序,)。
_xyz