PHP中strlen()和mb_strlen()的区别浅析


Posted in PHP onJune 19, 2014

在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:

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

PHP 相关文章推荐
Content-type 的说明
Oct 09 PHP
自己前几天写的无限分类类
Feb 14 PHP
linux php mysql数据库备份实现代码
Mar 10 PHP
PHP简单判断字符串是否包含另一个字符串的方法
Mar 25 PHP
PHP 年月日的三级联动实例代码
May 24 PHP
Laravel中获取路由参数Route Parameters的五种方法示例
Sep 29 PHP
php微信开发之谷歌测距
Jun 14 PHP
PHP中Static(静态)关键字功能与用法实例分析
Apr 05 PHP
PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例
Jun 17 PHP
php操作redis常见方法示例【key与value操作】
Apr 14 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
May 02 PHP
ThinkPHP5.1验证码功能实现的示例代码
Jun 08 PHP
php对包含html标签的字符串进行截取的函数分享
Jun 19 #PHP
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
Jun 19 #PHP
PHP base64编码后解码乱码的解决办法
Jun 19 #PHP
PHP安全的URL字符串base64编码和解码
Jun 19 #PHP
PHP中的多行字符串传递给JavaScript的两种方法
Jun 19 #PHP
ThinkPHP模板引擎之导入资源文件方法详解
Jun 18 #PHP
ThinkPHP CURD方法之field方法详解
Jun 18 #PHP
You might like
PHP简洁函数(PHP简单明了函数语法)
2012/06/10 PHP
PHP正则表达式 /i, /is, /s, /isU等介绍
2014/10/23 PHP
IIS下PHP的三种配置方式对比
2014/11/20 PHP
php数值计算num类简单操作示例
2020/05/15 PHP
多次注册事件会导致一个事件被触发多次的解决方法
2013/08/12 Javascript
javascript字符串替换及字符串分割示例代码
2013/12/12 Javascript
jquery中load方法的用法及注意事项说明
2014/02/22 Javascript
javascript中的__defineGetter__和__defineSetter__介绍
2014/08/15 Javascript
JavaScript设计模式之外观模式介绍
2014/12/28 Javascript
angularJS中$apply()方法详解
2015/01/07 Javascript
JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
2015/11/26 Javascript
jQuery实现的文字hover颜色渐变效果实例
2016/02/20 Javascript
BootStrap中
2016/12/10 Javascript
JS定时器用法分析【时钟与菜单中的应用】
2016/12/21 Javascript
使用smartupload组件实现jsp+jdbc上传下载文件实例解析
2017/01/05 Javascript
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
2017/06/30 Javascript
关于 angularJS的一些用法
2017/11/29 Javascript
vue项目webpack中Npm传递参数配置不同域名接口
2018/06/15 Javascript
JS实现数组深拷贝的方法分析
2019/03/06 Javascript
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
2019/04/01 Javascript
[00:31]DOTA2荣耀之路7:Miracle-空血无敌斩
2018/05/31 DOTA
python发腾讯微博代码分享
2014/01/10 Python
numpy 进行数组拼接,分别在行和列上合并的实例
2018/05/08 Python
Python函数装饰器常见使用方法实例详解
2019/03/30 Python
python绘制雷达图实例讲解
2021/01/03 Python
Keds官方网站:购买帆布运动鞋和经典皮鞋
2016/11/12 全球购物
俄罗斯宠物用品网上商店:ZooMag
2019/12/12 全球购物
幼儿园家长会邀请函
2014/01/15 职场文书
一年级班主任寄语
2014/01/19 职场文书
大学新学期计划书
2014/04/28 职场文书
党员个人查摆剖析材料
2014/10/16 职场文书
春风化雨观后感
2015/06/11 职场文书
田径运动会通讯稿
2015/07/18 职场文书
《我和小伙伴》教学反思
2016/02/20 职场文书
HTML+CSS+JS实现图片的瀑布流布局的示例代码
2021/04/22 HTML / CSS
Python超详细分步解析随机漫步
2022/03/17 Python