資料來源
http://ronny.wang/blog/post/27553364-php-%E5%88%87%E4%B8%AD%E6%96%87%E5%AD%97%E4%B8%B2%E6%80%8E%E9%BA%BC%E5%88%87
PHP 有一系列的 Multibyte String Functions ,很適合拿來處理 CJK 這些 Mutilbyte 字元
其中在切字串的部分就有三個不同的 function 可以用
分別是 mb_strcut, mb_substr, mb_strimwidth
mb_strcut($str, $start, $length, $charset); 所切出來的字串,是 byte 數不超過 $length 的字串,所以像是
mb_strcut(‘我是ronnywang’, 0, 8, ‘UTF-8’); 出來的就是 「我是ro」
適合用在所儲存的地方空間有限時,確保所占空間不要超過某個數字,但是又不要把 multibyte 字腰斬所使用。
mb_substr($str, $start, $length, $charset); 所切出來的字串,是總字數不超過 $length 的字串,其中中文和英文都分別算是一個字元,所以像是
mb_substr(‘我是ronnywang’, 0, 5, ‘UTF-8’); 出來的就是 「我是ron」 (總共四個字)
mb_strimwidth($str, $start, $width, $trimmarker, $charset); 所切出來的字串,是總長度不超過 $width 的字串,另外如果字需要被切到的話,還會幫你補上 $trimmarker (加上 $trimmarker 之後也不會超過 $width) ,而長度的部分,是以半形字是 1 全形字是 2 來計算,因此跟實際顯示出來的寬度會差不了多少。
像是
mb_strimwidth(‘我是ronnywang’, 0, 9, ‘…’, ‘UTF-8’); 出來的就是 「我是ro…」 (寬度為 9)
mb_strimwidth(‘我是’, 0, 9, ‘…’, ‘UTF-8’); 出來的就是 「我是」(寬度為4,小於 $width 就不會印出 … 了)
mb_strimwidth(‘我是ronny’, 0, 9, ‘…’, ‘UTF-8’); 出來的就是 「我是ronny」(寬度為9,剛好等於 $width 也不會印 …)
適合用在要顯示一些固定長度的文字使用。
另外還有幾個取得長度的方式
strlen($str); 最原始的,取得就是 byte 數,像是
strlen(‘我是誰’); 在 UTF-8 就是 9 ,一個字 3 bytes 。
mb_strlen($str, $charset); 出來的是字數,像是
mb_strlen(‘我是誰’, ‘UTF-8’) 是 3
mb_strlen(‘我是ronny’, ‘UTF-8’) 是 7
mb_strwidth($str, $charset); 出來的是寬度,一樣是半形字算 1 ,全形字算 2
mb_strwidth(‘我是誰’, ‘UTF-8’) 是 6
mb_strwidth(‘我是ronny’, ‘UTF-8’) 是 9
依照不同需求就使用不同函式囉。