在PHP中,strlen與mb_strlen是求字符串長度的函數,可是對於一些初學者來講,若是不看手冊,也許不太清楚其中的區別。
下面經過例子,講解這二者之間的區別。php
先看例子:web
<?php //測試時文件的編碼方式要是UTF8 $str='中文a字1符'; echo strlen($str).'<br>';//14 echo mb_strlen($str,'utf8').'<br>';//6 echo mb_strlen($str,'gbk').'<br>';//8 echo mb_strlen($str,'gb2312').'<br>';//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;
例如 「中文a字1符」 的strlen($str)值是14,mb_strlen($str)值是6,則能夠計算出「中文a字1符」的佔位是10.編碼
echo mb_internal_encoding();
PHP內置的字符串長度函數strlen沒法正確處理中文字符串,它得 到的只是字符串所佔的字節數。對於GB2312的中文編碼,strlen獲得的值是漢字個數的2倍,而對於UTF-8編碼的中文,就是3倍的差別了(在 UTF-8編碼下,一個漢字佔3個字節)。code
採用mb_strlen函數能夠較好地解決這個問題。mb_strlen的用法和 strlen相似,只不過它有第二個可選參數用於指定字符編碼。例如獲得UTF-8的字符串$str長度,能夠用 mb_strlen($str,'UTF-8')。若是省略第二個參數,則會使用PHP的內部編碼。內部編碼能夠經過 mb_internal_encoding()函數獲得。orm
須要注意的是,mb_strlen並非PHP核心函數,使用前須要確保在php.ini中加載了php_mbstring.dll,即確保「extension=php_mbstring.dll」這一行存在而且沒有被註釋掉,不然會出現未定義函 數的問題。字符串