Maison >développement back-end >tutoriel php >PHP中strlen和mb_strlen的区别详解

PHP中strlen和mb_strlen的区别详解

WBOY
WBOYoriginal
2016-06-20 13:03:081279parcourir

PHP中,strlenmb_strlen两个函数都是用来求字符串长度的,也是我们日常工作中会经常使用到的函数之一,虽然不算难理解,但是对于一些初学者来说,如果不看手册的话,可能还是分不清楚它们的区别。

好的,不废话了,下面就让我们通过例子来给大家讲解这两者之间的区别吧。

<?php /* 测试时文件的编码方式注意一定要是UTF8  */
$str=&#39;中文a字1符&#39;;
echo strlen($str).&#39;<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.

echo 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_internal_encoding()函数得到。

注意:mb_strlen并不是PHP的核心函数,使用前必须确保在php.ini中加载了php_mbstring.dll这一项,即确保 “extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。也就不能使用这个函数了。包括mb_开头的一些函数,如mb_substr()函数等等。


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn