細說PHP中strlen和mb_strlen的區別

傑克.陳發表於2014-12-19
原文:細說PHP中strlen和mb_strlen的區別

PHP中,strlenmb_strlen是求字串長度的函式,但是對於一些初學者來說,如果不看手冊,也許不太清楚其中的區別。
下面通過例子,講解這兩者之間的區別。

$str=`中文a字1符`;  
echo strlen($str);//位元組個數 ,14
echo mb_strlen($str,`UTF-8`);//選定內碼為UTF-8,中文作為一個位元組,6
echo mb_strlen($str,`gbk`); //8
echo mb_strlen($str,`gb2312`); //10

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

至於gbk,gb2312我也不太清楚,請大家指教。

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

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

例如 “中文a字1符” 的strlen($str)值是14,mb_strlen($str)值是6,則可以計算出“中文a字1符”的佔位是10.

echo mb_internal_encoding();

內部編碼可以通過 mb_internal_encoding()函式得到。

 

  PHP內建的字串長度函式strlen無法正確處理中文字串,它得 到的只是字串所佔的位元組數。對於GB2312的中文編碼,strlen得到的值是漢字個數的2倍,而對於UTF-8編碼的中文,就是3倍的差異了(在 UTF-8編碼下,一個漢字佔3個位元組)。

採用mb_strlen函式可以較好地解決這個問題。mb_strlen的用法和 strlen類似,只不過它有第二個可選引數用於指定字元編碼。例如得到UTF-8的字串$str長度,可以用 mb_strlen($str,`UTF-8`)。如果省略第二個引數,則會使用PHP的內部編碼。

  需要注意的是,mb_strlen並不是PHP核心函式,使用前需要確保在php.ini中載入了php_mbstring.dll,即確保“extension=php_mbstring.dll”這一行存在並且沒有被註釋掉,否則會出現未定義函 數的問題。

關於 mb_internal_encoding();中的說的內部編碼,是php在處理寬字元時. 預設處理文字檔案會使用那個編碼設定。

寬字元是指需要多位元組表示的字元。mb_internal_encoding 是設定獲取獲取mb擴充套件的預設編碼設定。mb擴充套件是php的一個處理寬字元(例如:中文,日文,韓文等)函式庫。

strlen(),substr() 操作字串的時候都是按照內部編碼(mb_internal_encoding())來處理的。


相關文章