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 相关文章推荐
php中stream(流)的用法
Mar 25 PHP
PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
Dec 25 PHP
yum命令安装php7和相关扩展
Jul 04 PHP
PHP云打印类完整示例
Oct 15 PHP
php获取excel文件数据
Apr 21 PHP
php实现留言板功能(会话控制)
May 23 PHP
php实现生成code128条形码的方法详解
Jul 19 PHP
php 二维数组快速排序算法的实现代码
Oct 17 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
Oct 18 PHP
php多进程模拟并发事务产生的问题小结
Dec 07 PHP
PHP中Session ID的实现原理实例分析
Aug 17 PHP
php解决约瑟夫环算法实例分析
Sep 30 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实现即时输出、实时输出内容方法
2015/05/27 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
Mootools 1.2教程 选项卡效果(Tabs)
2009/09/15 Javascript
jQuery实现数秒后自动提交form的方法
2015/03/05 Javascript
jquery实现无限分级横向导航菜单的方法
2015/03/12 Javascript
jquery模拟进度条实现方法
2015/08/03 Javascript
JQuery 在文档中查找指定name的元素并移除的实现方法
2016/05/19 Javascript
js防阻塞加载的实现方法
2016/09/09 Javascript
JavaScript  event对象整理及详细介绍
2016/10/10 Javascript
js 递归和定时器的实例解析
2017/02/03 Javascript
Vue自定义图片懒加载指令v-lazyload详解
2020/12/31 Javascript
微信小程序中setInterval的使用方法
2017/09/29 Javascript
JS实现的点击按钮图片上下滚动效果示例
2019/01/28 Javascript
详解使用Nuxt.js快速搭建服务端渲染(SSR)应用
2019/03/13 Javascript
windows实现npm和cnpm安装步骤
2019/10/24 Javascript
通过js随机函数Math.random实现乱序
2020/05/19 Javascript
基于JavaScript实现大文件上传后端代码实例
2020/08/18 Javascript
openlayers 3实现车辆轨迹回放
2020/09/24 Javascript
[01:04:22]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 IG vs EG
2018/04/01 DOTA
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
2016/06/14 Python
Python之re操作方法(详解)
2017/06/14 Python
python 实现tar文件压缩解压的实例详解
2017/08/20 Python
Python BS4库的安装与使用详解
2018/08/08 Python
在双python下设置python3为默认的方法
2018/10/31 Python
对python3.4 字符串转16进制的实例详解
2019/06/12 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
2020/04/01 Python
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
成功经营餐厅的创业计划书范文
2013/12/26 职场文书
中学教师培训制度
2014/01/31 职场文书
高中生的自我评价
2014/03/04 职场文书
机关作风整顿个人整改措施思想汇报
2014/09/29 职场文书
渠道运营商合作协议书范本
2014/10/06 职场文书
计划生育个人总结
2015/03/02 职场文书
opencv读取视频并保存图像的方法
2021/06/04 Python
在 Python 中利用 Pool 进行多线程
2022/04/24 Python
HTML中实现音乐或视频自动播放案例详解
2022/05/30 HTML / CSS