天天看點

strlen與mb_strlen的差別

在PHP中,strlen與mb_strlen是求字元串長度的函數,但是對于一些初學者來說,如果不看手冊,也許不太清楚其中的差別。

先來看看手冊中的定義

strlen
strlen — 擷取字元串長度
int strlen ( string $string )      

傳回給定的字元串 string 的長度。

mb_strlen
int mb_strlen ( string $str [, string $encoding ] )      

傳回給定的字元串 string 的長度。

encoding參數為字元編碼。如果省略,則使用内部字元編碼。内部編碼可以通過 ​

​mb_internal_encoding()​

​​函數得到。

這麼看除了mb_strlen可以傳遞一個字元編碼好像沒有其他差別,下面通過例子,講解這兩者之間的差別。先看例子:

代碼如下:

<?php    //測試時檔案的編碼方式要是UTF8    
$str='中文a字1符';    
echo mb_internal_encoding().PHP_EOL;
echo strlen($str).PHP_EOL;//14    
echo mb_strlen($str,'utf8').PHP_EOL;//6    
echo mb_strlen($str,'gbk').PHP_EOL;//8    
echo mb_strlen($str,'gb2312').PHP_EOL;//10    
?>      

結果分析:在strlen計算時,對待一個UTF8的中文字元是3個長度,是以“中文a字1符”長度是3*4+2=14,在mb_strlen計算時,標明内碼為UTF8,則會将一個中文字元當作長度1來計算,是以“中文a字1符”長度是6 .

利用這兩個函數則可以聯合計算出一個中英文混排的串的占位是多少(一個中文字元的占位是2,英文字元是1)。

代碼如下:

echo (strlen($str) + mb_strlen($str,'UTF8')) / 2;      

需要注意的是,mb_strlen并不是PHP核心函數,依賴mbstring這個擴充。