浅析PHP中strlen和mb_strlen的区别

 更新时间:2014年08月31日 09:54:18   投稿:hebedich  
在php中常见的计算字符串长度的函数有:strlen和mb_strlen.当字符全是英文字符的时候,两者是一样。这里主要比较一下,中英文混排的时候,两个计算结果。

在PHP中,strlen与mb_strlen是求字符串长度的函数,但是对于一些初学者来说,如果不看手册,也许不太清楚其中的区别。
下面通过例子,讲解这两者之间的区别。

先看例子:

<?php 
//测试时文件的编码方式要是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 
?> 

结果分析:在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”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。

相关文章

  • 关于DISCUZ不用通行证登陆得内容介绍

    关于DISCUZ不用通行证登陆得内容介绍

    DISCUZ是中国最常用的论坛,虽然他本身有通行证给大家连接,但实际上用户的统一还是很不好,经常要建立两个用户表,第一不利于注册和管理,第二浪费数据库。
    2008-10-10
  • Yii操作数据库实现动态获取表名的方法

    Yii操作数据库实现动态获取表名的方法

    这篇文章主要介绍了Yii操作数据库实现动态获取表名的方法,涉及Yii框架针对数据库的动态操作技巧,需要的朋友可以参考下
    2016-03-03
  • laravel yajra插件 datatable的使用详解

    laravel yajra插件 datatable的使用详解

    这篇文章主要介绍了laravel yajra插件 datatable的使用详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • PHP中使用GD库绘制折线图 折线统计图的绘制方法

    PHP中使用GD库绘制折线图 折线统计图的绘制方法

    本文通过代码给大家介绍php中使用GD库绘制折线图,涉及到php中GD库的一些简单使用,本文介绍的非常详细,感兴趣的朋友一起学习吧
    2015-11-11
  • Yii2中事务的使用实例代码详解

    Yii2中事务的使用实例代码详解

    这篇文章主要介绍了Yii2中事务的使用实例代码详解的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • 浅谈laravel5.5 belongsToMany自身的正确用法

    浅谈laravel5.5 belongsToMany自身的正确用法

    今天小编就为大家分享一篇浅谈laravel5.5 belongsToMany自身的正确用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • Yii使用Captcha验证码的方法

    Yii使用Captcha验证码的方法

    这篇文章主要介绍了Yii使用Captcha验证码的方法,结合实例形式分析了Yii使用Captcha验证码的MVC三层具体实现技巧,需要的朋友可以参考下
    2015-12-12
  • thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)

    thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)

    这篇文章主要介绍了thinkPHP连接sqlite3数据库的实现方法,涉及thinkPHP的数据库相关配置技巧,并附带了Thinkphp代码生成器供读者下载使用,需要的朋友可以参考下
    2016-05-05
  • PHP设计模式之观察者模式实例

    PHP设计模式之观察者模式实例

    一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。通过本文给大家介绍PHP设计模式之观察者模式,需要的朋友参考下
    2016-02-02
  • php5.x禁用eval的操作方法

    php5.x禁用eval的操作方法

    这篇文章主要介绍了php5.x禁用eval的操作方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-10-10

最新评论