如何将字符串按指定长度分割(多字节安全)?
Posted by: ameliorate 2006-07-12 11:37 |
CODE |
<?php $split_length = 268; $string = <<<EOT 持有太平洋卡的客户可以在全国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 |
<?php /** * 按指定长度分割字符串为数组(多字节安全) * */ 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 的热心帮助(按拼音字母排序, )。
|
|