細說PHP中strlen和mb_strlen的區別
在PHP中,strlen與mb_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())來處理的。
相關文章
- 《細說PHP》中strlen和mb_strlen的區別PHP
- C/C++——sizeof和strlen的區別C++
- sizeof與strlen的區別
- sizeof 與 strlen 的區別
- strlen與sizeof的區別
- PHP 中的 -> 和 :: 的區別PHP
- centos PHP7 yii2 報錯 Call to undefined function yii\\helpers\\mb_strlen()CentOSPHPUndefinedFunction
- 細說紛紜——Redis 和 Memcached 的區別Redis
- 細說new和malloc的十大區別
- php中TCP和UDP的區別PHPTCPUDP
- ***PHP中empty()和isset()的區別PHP
- php中curl的詳細解說PHP
- PHP中session和cookie的區別薦PHPSessionCookie
- PHP中MySQL、MySQLi和PDO的用法和區別PHPMySql
- C語言中的strlen與sizeof的區別C語言
- php中aes加密和rsa加密的區別PHP加密
- 「乾貨」細說 call、apply 以及 bind 的區別和用法APP
- PHP 中 bind 的用法 self 和 static 的區別PHP
- PHP中empty、isset和is_null的使用區別PHPNull
- 細說駭客和普通程式設計師的十大區別程式設計師
- 閒說: Java 中Comparable 和 Comparator 的區別Java
- PHP 中 include 和 require 的概要及區別介紹PHPUI
- php中的執行緒、程式和併發區別PHP執行緒
- PHP中單引號和雙引號的區別PHP
- HashMap和Hashtable的詳細區別HashMap
- php中的var_dump()方法的詳細說明PHP
- php中$_REQUEST、$_POST、$_GET的區別和聯絡小結PHP
- php中const和define有什麼區別PHP
- 請說說`<script>`、`<script async>`和`<script defer>`的區別
- 細說SQL SERVER中欄位型別SQLServer型別
- 細說setTimeout/setImmediate/process.nextTick的區別
- 面試官:兄弟,說說基本型別和包裝型別的區別吧面試型別
- PHP中explode與split的區別分析PHP
- 解析php中die(),exit(),return的區別PHP
- PHP中 new clone __clone區別PHP
- mysql中!=和is not的區別MySql
- JavaScript中for in 和for of的區別JavaScript
- mysql中“ ‘ “和 “ ` “的區別MySql