小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

如何將字符串按指定長度分割(多字節(jié)安全)?

 Ralf_Jones 2006-07-13
 如何將字符串按指定長度分割(多字節(jié)安全)?

Posted by: ameliorate 2006-07-12 11:37
CODE
<?php
$split_length = 268;
$string = <<<EOT
持有太平洋卡的客戶可以在全國140個城市的3200家交通銀行網(wǎng)點(diǎn)享受
異地存取款、轉(zhuǎn)賬的輕松和便利,同時(shí)交通銀行的自助設(shè)備將為您提供
24小時(shí)快捷服務(wù)。持有太平洋卡的客戶可以在全國140個城市的3200家
交通銀行網(wǎng)點(diǎn)享受異地存取款、轉(zhuǎn)賬的輕松和便利,同時(shí)交通銀行的自
助設(shè)備將為您提供24小時(shí)快捷服務(wù)。
EOT; // 以上字符不換行(為瀏覽方便,手動換行)

mb_internal_encoding(‘gbk‘);

$res = str_split($string, 40);

print_r($res);
?>

輸出:
mb_split()要用到正則,偶正則不熟 :(
CODE
Array
(
   [0] => 持有太平洋卡的客戶可以在全國140個城市的3
   [1] => 200家交通銀行網(wǎng)點(diǎn)享受異地存取款、轉(zhuǎn)賬的?
   [2] => 崴珊捅憷苯煌ㄒ械淖災(zāi)璞附
   [3] => 峁?4小時(shí)快捷服務(wù)。持有太平洋卡的客戶可?
   [4] => 栽諶?40個城市的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的,前或者后多給一位

沒有更方便的辦法嗎? smile_wink.gif

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手冊中的 mb_* 函數(shù)我都看過啦,沒有類似 str_split() 功能的函數(shù)。

如果依托 mb_strcut() 寫一個 mb_str_split(),要考慮到好多細(xì)節(jié)問題。
過程如下(每次截取36字節(jié),每個漢字為2字節(jié)):
1、截取由位置 0 起始的 36 個字節(jié);
2、考慮截取 36 個字節(jié)后,下一個起始位置是 35 還是 36(也就是說,第一次實(shí)際上截取了35個字節(jié)還是36個字節(jié))?
3、考慮到每次實(shí)際截取的字節(jié)數(shù)可能不是 36 的整數(shù)倍,那么究竟應(yīng)截取多少次(ceil($string_length/$split_length)是不可靠的)?
4、如果用ASCII碼>127也有部分生僻字會出現(xiàn)問題。
5、擴(kuò)展為 UTF-8 編碼,還要考慮每個漢字是3個字節(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手冊中的 mb_* 函數(shù)我都看過啦,沒有類似 str_split() 功能的函數(shù)。

如果依托 mb_strcut() 寫一個 mb_str_split(),要考慮到好多細(xì)節(jié)問題。
過程如下(每次截取36字節(jié),每個漢字為2字節(jié)):
1、截取由位置 0 起始的 36 個字節(jié);
2、考慮截取 36 個字節(jié)后,下一個起始位置是 35 還是 36(也就是說,第一次實(shí)際上截取了35個字節(jié)還是36個字節(jié))?
3、考慮到每次實(shí)際截取的字節(jié)數(shù)可能不是 36 的整數(shù)倍,那么究竟應(yīng)截取多少次(ceil($string_length/$split_length)是不可靠的)?
4、如果用ASCII碼>127也有部分生僻字會出現(xiàn)問題。
5、擴(kuò)展為 UTF-8 編碼,還要考慮每個漢字是3個字節(jié)。

看來你還是沒有仔細(xì)看,有個 mb_substr() 的函數(shù)也許對你有幫助

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);
       // 返回一個數(shù)組元素
       $return[] = $mb_strcut;
   }
   // 返回一個值
   return $return;
}
?>

Posted by: aDang 2006-07-12 15:45
在MBString庫里面,不用去關(guān)心字節(jié)的問題
mb_strimwidth() 截取你想要的寬度,比如40個半角英文的寬度
mb_strlen() 計(jì)算一下截出來了多少個字符
mb_substr() 從原字符串里面把截出來的字符刪掉
設(shè)置好了字符集,mb函數(shù)操作的一切,都是整個字符,比如‘a(chǎn)‘是一個字符,‘中‘也是一個字符
不需要自己去計(jì)算什么編碼方式下多少個字節(jié)表示一個字符

Posted by: ameliorate 2006-07-12 15:53
感謝 aDang、Dalamar、nio 的熱心幫助(按拼音字母排序, smile_wink.gif )。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多