如何將字符串按指定長度分割(多字節(jié)安全)?
Posted by: ameliorate 2006-07-12 11:37 |
CODE |
<?php $split_length = 268; $string = <<<EOT 持有太平洋卡的客戶可以在全國140個(gè)城市的3200家交通銀行網(wǎng)點(diǎn)享受 異地存取款、轉(zhuǎn)賬的輕松和便利,同時(shí)交通銀行的自助設(shè)備將為您提供 24小時(shí)快捷服務(wù)。持有太平洋卡的客戶可以在全國140個(gè)城市的3200家 交通銀行網(wǎng)點(diǎn)享受異地存取款、轉(zhuǎn)賬的輕松和便利,同時(shí)交通銀行的自 助設(shè)備將為您提供24小時(shí)快捷服務(wù)。 EOT; // 以上字符不換行(為瀏覽方便,手動(dòng)換行)
mb_internal_encoding(‘gbk‘);
$res = str_split($string, 40);
print_r($res); ?> |
輸出: mb_split()要用到正則,偶正則不熟 :(
CODE |
Array ( [0] => 持有太平洋卡的客戶可以在全國140個(gè)城市的3 [1] => 200家交通銀行網(wǎng)點(diǎn)享受異地存取款、轉(zhuǎn)賬的? [2] => 崴珊捅憷?,同时交通银行的诪?zāi)璞附 [3] => 峁?4小時(shí)快捷服務(wù)。持有太平洋卡的客戶可? [4] => 栽諶?40個(gè)城市的3200家交通銀行網(wǎng)點(diǎn)享受 [5] => 異地存取款、轉(zhuǎn)賬的輕松和便利,同時(shí)交通銀 [6] => 行的自助設(shè)備將為您提供24小時(shí)快捷服務(wù)。 ) |
|
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_ 開頭的一串函數(shù)
很好用
|
Posted by: ameliorate 2006-07-12 14:54 |
QUOTE (aDang @ 2006-07-12 13:43) |
mb_ 開頭的一串函數(shù)
很好用 |
不要這么籠統(tǒng)啊。PHP手冊(cè)中的 mb_* 函數(shù)我都看過啦,沒有類似 str_split() 功能的函數(shù)。
如果依托 mb_strcut() 寫一個(gè) mb_str_split(),要考慮到好多細(xì)節(jié)問題。 過程如下(每次截取36字節(jié),每個(gè)漢字為2字節(jié)): 1、截取由位置 0 起始的 36 個(gè)字節(jié); 2、考慮截取 36 個(gè)字節(jié)后,下一個(gè)起始位置是 35 還是 36(也就是說,第一次實(shí)際上截取了35個(gè)字節(jié)還是36個(gè)字節(jié))? 3、考慮到每次實(shí)際截取的字節(jié)數(shù)可能不是 36 的整數(shù)倍,那么究竟應(yīng)截取多少次(ceil($string_length/$split_length)是不可靠的)? 4、如果用ASCII碼>127也有部分生僻字會(huì)出現(xiàn)問題。 5、擴(kuò)展為 UTF-8 編碼,還要考慮每個(gè)漢字是3個(gè)字節(jié)。 |
Posted by: nio 2006-07-12 15:36 |
QUOTE (ameliorate @ 2006-07-12 14:54) |
QUOTE (aDang @ 2006-07-12 13:43) |
mb_ 開頭的一串函數(shù)
很好用 |
不要這么籠統(tǒng)啊。PHP手冊(cè)中的 mb_* 函數(shù)我都看過啦,沒有類似 str_split() 功能的函數(shù)。
如果依托 mb_strcut() 寫一個(gè) mb_str_split(),要考慮到好多細(xì)節(jié)問題。 過程如下(每次截取36字節(jié),每個(gè)漢字為2字節(jié)): 1、截取由位置 0 起始的 36 個(gè)字節(jié); 2、考慮截取 36 個(gè)字節(jié)后,下一個(gè)起始位置是 35 還是 36(也就是說,第一次實(shí)際上截取了35個(gè)字節(jié)還是36個(gè)字節(jié))? 3、考慮到每次實(shí)際截取的字節(jié)數(shù)可能不是 36 的整數(shù)倍,那么究竟應(yīng)截取多少次(ceil($string_length/$split_length)是不可靠的)? 4、如果用ASCII碼>127也有部分生僻字會(huì)出現(xiàn)問題。 5、擴(kuò)展為 UTF-8 編碼,還要考慮每個(gè)漢字是3個(gè)字節(jié)。 |
看來你還是沒有仔細(xì)看,有個(gè) mb_substr() 的函數(shù)也許對(duì)你有幫助 |
Posted by: ameliorate 2006-07-12 15:37 |
已解決。
CODE |
<?php /** * 按指定長度分割字符串為數(shù)組(多字節(jié)安全) * */ function mb_str_split($string, $split_length, $encoding = ‘gbk‘) { // 設(shè)置字符集編碼 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); // 返回一個(gè)數(shù)組元素 $return[] = $mb_strcut; } // 返回一個(gè)值 return $return; } ?> |
|
Posted by: aDang 2006-07-12 15:45 |
在MBString庫里面,不用去關(guān)心字節(jié)的問題 mb_strimwidth() 截取你想要的寬度,比如40個(gè)半角英文的寬度 mb_strlen() 計(jì)算一下截出來了多少個(gè)字符 mb_substr() 從原字符串里面把截出來的字符刪掉 設(shè)置好了字符集,mb函數(shù)操作的一切,都是整個(gè)字符,比如‘a(chǎn)‘是一個(gè)字符,‘中‘也是一個(gè)字符 不需要自己去計(jì)算什么編碼方式下多少個(gè)字節(jié)表示一個(gè)字符 |
Posted by: ameliorate 2006-07-12 15:53 |
感謝 aDang、Dalamar、nio 的熱心幫助(按拼音字母排序, )。
|
|