字符串長(zhǎng)度函數(shù)strlen和mb_strlen的區(qū)別示例介紹
在php中常見(jiàn)的計(jì)算字符串長(zhǎng)度的函數(shù)有:strlen和mb_strlen.當(dāng)字符全是英文字符的時(shí)候,兩者是一樣。這里主要比較一下,中英文混排的時(shí)候,兩個(gè)計(jì)算結(jié)果。
在PHP中,strlen與mb_strlen是求字符串長(zhǎng)度的函數(shù),但是對(duì)于一些初學(xué)者來(lái)說(shuō),如果不看手冊(cè),也許不太清楚其中的區(qū)別。
下面通過(guò)例子,講解這兩者之間的區(qū)別。
先看例子:
<?php //測(cè)試時(shí)文件的編碼方式要是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 ?>
結(jié)果分析:在strlen計(jì)算時(shí),對(duì)待一個(gè)UTF8的中文字符是3個(gè)長(zhǎng)度,所以“中文a字1符”長(zhǎng)度是3*4+2=14,在mb_strlen計(jì)算時(shí),選定內(nèi)碼為UTF8,則會(huì)將一個(gè)中文字符當(dāng)作長(zhǎng)度1來(lái)計(jì)算,所以“中文a字1符”長(zhǎng)度是6 .
利用這兩個(gè)函數(shù)則可以聯(lián)合計(jì)算出一個(gè)中英文混排的串的占位是多少(一個(gè)中文字符的占位是2,英文字符是1)
echo (strlen($str) + mb_strlen($str,'UTF8')) / 2;
例如 “中文a字1符” 的strlen($str)值是14,mb_strlen($str)值是6,則可以計(jì)算出“中文a字1符”的占位是10.
echo mb_internal_encoding();
PHP內(nèi)置的字符串長(zhǎng)度函數(shù)strlen無(wú)法正確處理中文字符串,它得 到的只是字符串所占的字節(jié)數(shù)。對(duì)于GB2312的中文編碼,strlen得到的值是漢字個(gè)數(shù)的2倍,而對(duì)于UTF-8編碼的中文,就是3倍的差異了(在 UTF-8編碼下,一個(gè)漢字占3個(gè)字節(jié))。
采用mb_strlen函數(shù)可以較好地解決這個(gè)問(wèn)題。mb_strlen的用法和 strlen類(lèi)似,只不過(guò)它有第二個(gè)可選參數(shù)用于指定字符編碼。例如得到UTF-8的字符串$str長(zhǎng)度,可以用 mb_strlen($str,'UTF-8')。如果省略第二個(gè)參數(shù),則會(huì)使用PHP的內(nèi)部編碼。內(nèi)部編碼可以通過(guò) mb_internal_encoding()函數(shù)得到。
需要注意的是,mb_strlen并不是PHP核心函數(shù),使用前需要確保在php.ini中加載了php_mbstring.dll,即確?!癳xtension=php_mbstring.dll”這一行存在并且沒(méi)有被注釋掉,否則會(huì)出現(xiàn)未定義函 數(shù)的問(wèn)題。
相關(guān)文章
PHPExcel在linux環(huán)境下導(dǎo)出報(bào)500錯(cuò)誤的解決方法
下面小編就為大家?guī)?lái)一篇PHPExcel在linux環(huán)境下導(dǎo)出報(bào)500錯(cuò)誤的解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01PHP 使用openssl 擴(kuò)展實(shí)現(xiàn)公鑰加密的方法
下面小編就為大家分享一篇PHP 使用openssl 擴(kuò)展實(shí)現(xiàn)公鑰加密的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03PHP ADODB實(shí)現(xiàn)事務(wù)處理功能示例
這篇文章主要介紹了PHP ADODB實(shí)現(xiàn)事務(wù)處理功能,結(jié)合實(shí)例形式分析了php使用ADODB進(jìn)行事務(wù)提交與回滾處理等相關(guān)操作技巧,需要的朋友可以參考下2018-05-05php 調(diào)試?yán)鱠ebug_print_backtrace()
debug_print_backtrace() 是一個(gè)很低調(diào)的函數(shù),很少有人注意過(guò)它. 不過(guò)當(dāng)我對(duì)著一個(gè)對(duì)象調(diào)用另一個(gè)對(duì)象再調(diào)用其它的對(duì)象和文件中的一個(gè)函數(shù)出錯(cuò)時(shí),它正在一邊笑呢2012-07-07Linux(CentOS)下PHP擴(kuò)展PDO編譯安裝的方法
這篇文章主要介紹了Linux(CentOS)下PHP擴(kuò)展PDO編譯安裝的方法,詳細(xì)說(shuō)明了Linux下安裝PHP的PDO擴(kuò)展所涉及的相關(guān)技巧與詳細(xì)步驟,需要的朋友可以參考下2016-04-04php判斷類(lèi)是否存在函數(shù)class_exists用法分析
這篇文章主要介紹了php判斷類(lèi)是否存在函數(shù)class_exists用法,實(shí)例分析了PHP針對(duì)類(lèi)是否存在進(jìn)行判斷的應(yīng)用,對(duì)于自動(dòng)加載類(lèi)以及類(lèi)實(shí)例化之前的存在判斷來(lái)說(shuō)都非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-11-11PHP5中使用mysqli的prepare操作數(shù)據(jù)庫(kù)的介紹
今天小編就為大家分享一篇關(guān)于PHP5中使用mysqli的prepare操作數(shù)據(jù)庫(kù)的介紹,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03帖幾個(gè)PHP的無(wú)限分類(lèi)實(shí)現(xiàn)想法~
帖幾個(gè)PHP的無(wú)限分類(lèi)實(shí)現(xiàn)想法~...2007-01-01淺析php中array_map和array_walk的使用對(duì)比
這篇文章給大家先是詳細(xì)的介紹了array_map()和array_walk()的語(yǔ)法、參數(shù)以及注意事項(xiàng),而后又給大家詳細(xì)的介紹了其中的關(guān)鍵點(diǎn),文中介紹的很詳細(xì),相信會(huì)對(duì)大家的理解和學(xué)習(xí)很有幫助,有需要的朋友們可以參考借鑒,感興趣的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2016-11-11