PHP中strlen和mb_strlen函數的區別

來源:互聯網
上載者:User

在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

?>

另外,對於各個編碼對字元長度的影響規律還在測試中,我把我的測試結果發在這裡,歡迎知道的朋友告訴我,謝謝!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.