[PHP] strlen() 與 mb_strlen() 的差別,計算字串長度

在使用 php 計算字串長度時,可能是計算字串所佔的位元(bytes),由於各編碼所佔的空間又大不相同,但通常我們需要的是計算這個字串真正的字數。

ps. 這邊我的預設主機編碼為 utf-8


<?php

$str="abc";
echo "string: ".$str."\n";
echo "strlen(str): ".strlen($str)."\n";
echo "mb_strlen(str): ".mb_strlen($str,'utf-8')."\n";

// string: abc
// strlen(str): 3
// mb_strlen(str): 3
?>;

從上面這個例子,我們可以看到的輸出都是 3 的長度。(主要是英文或符號在此都是以字元 1 byte 來儲存)

接下來我們看看混上一些中文

<?php

$str="中文abc。";
echo "string: ".$str."\n";
echo "strlen(str): ".strlen($str)."\n";
echo "mb_strlen(str): ".mb_strlen($str,'utf-8')."\n";

// string: 中文abc。
// strlen(str): 12
// mb_strlen(str): 6
?>

以上這個例子我們可以發現 strlen() 回傳 12 ,然而 mb_strlen() 回傳 6 才是正確的字數。

主要是因為 utf-8 編碼儲存中文時,每個字會是 3bytes (33 + 13 = 12),導致 strlen() 得到 12 的長度。

 

參考資料:

http://expect7.pixnet.net/blog/post/44229026-%5B%E7%A8%8B%E5%BC%8F%5D%5Bphp%5D-strlen%E8%88%87mb_strlen%E9%83%BD%E6%98%AF%E8%A8%88%E7%AE%97%E5%AD%97%E4%B8%B2%E9%95%B7%E5%BA%A6%EF%BC%81

Leave a Reply