在PHP中,strlen與mb_strlen是求字串長度的函數,但是對於一些初學者來說,如果不看手冊,也許不太清楚其中的區別…
先看例子:
<?php
$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.
PHP內建的字串長度函數strlen無法正確處理中文字串,它得 到的只是字串所佔的位元組數。對於GB2312的中文編碼,strlen得到的值是漢字個數的2倍,而對於UTF-8編碼的中文,就是3倍的差異了(在 UTF-8編碼下,一個漢字佔3個位元組)
補充:
裡面代碼如下(代碼編碼為UTF-8):
<?php
$str1 = 'www.111cn.net';
$str2 = '煙雨網';
$str3 = '煙雨網111cn.net';
echo mb_strlen($str1).'<br>';//結果15
echo mb_strlen($str2).'<br>';//結果6
echo mb_strlen($str3).'<br>';//結果17
echo '--------1-------------<br>';
echo strlen($str1).'<br>';//結果15
echo strlen($str2).'<br>';//結果6
echo strlen($str3).'<br>';//結果17
echo '--------utf-8-------------<br>';
echo mb_strlen($str1,'utf-8').'<br>';//結果15
echo mb_strlen($str2,'utf-8').'<br>';//結果3
echo mb_strlen($str3,'utf-8').'<br>';//結果14
echo '--------gbk-------------<br>';
echo mb_strlen($str1,'gbk').'<br>';//結果15
echo mb_strlen($str2,'gbk').'<br>';//結果5
echo mb_strlen($str3,'gbk').'<br>';//結果15
echo '--------gb2312-------------<br>';
echo mb_strlen($str1,'gb2312').'<br>';//結果15
echo mb_strlen($str2,'gb2312').'<br>';//結果5
echo mb_strlen($str3,'gb2312').'<br>';//結果16
?>
至此現在只得出兩點結論:
1. 當為英文字母時,strlen和mb_strlen可以通用,編碼不同,兩個函數結果都是一樣。
2. 當為中文時候,編碼會影響字元的長度,就算是中文對於GBK和GB2312都是不同的表現。
3. 代碼編碼為UTF-8,否則得出的結果現象會和我的有出入,當為其他編碼時候,比如為ANSI時結果值會為另外的值,而且需要注意的是,mb_strlen並不是PHP核心函數,需要載入擴充,代碼結果如下:
(代碼編碼為ANSI)
<?php
$str1 = 'www.111cn.net';
$str2 = '煙雨網';
$str3 = '煙雨網111cn.net';
echo mb_strlen($str1).'<br>';//結果15
echo mb_strlen($str2).'<br>';//結果6
echo mb_strlen($str3).'<br>';//結果17
echo '--------1-------------<br>';
echo strlen($str1).'<br>';//結果15
echo strlen($str2).'<br>';//結果6
echo strlen($str3).'<br>';//結果17
echo '--------utf-8-------------<br>';
echo mb_strlen($str1,'utf-8').'<br>';//結果15
echo mb_strlen($str2,'utf-8').'<br>';//結果3
echo mb_strlen($str3,'utf-8').'<br>';//結果14
echo '--------gbk-------------<br>';
echo mb_strlen($str1,'gbk').'<br>';//結果15
echo mb_strlen($str2,'gbk').'<br>';//結果3
echo mb_strlen($str3,'gbk').'<br>';//結果14
echo '--------gb2312-------------<br>';
echo mb_strlen($str1,'gb2312').'<br>';//結果15
echo mb_strlen($str2,'gb2312').'<br>';//結果3
echo mb_strlen($str3,'gb2312').'<br>';//結果14
?>
另外,對於各個編碼對字元長度的影響規律還在測試中,我把我的測試結果發在這裡,歡迎知道的朋友告訴我,謝謝!