详解PHP中strlen和mb_strlen函数的区别


Posted in PHP onMarch 07, 2014

在PHP里有两个计算字符串个数的函数
一个是 strlen,一个是mb_strlen;
先来看看手册中的定义
strlen
strlen — 获取字符串长度
int strlen ( string $string )
返回给定的字符串 string 的长度。

mb_strlen
int mb_strlen ( string $str [, string $encoding ] )
返回给定的字符串 string 的长度。
encoding参数为字符编码。如果省略,则使用内部字符编码。

这么看除了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核心函数,Windows 下使用前需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函数的问题。Linux 下需要编译这个扩展。
 

PHP 相关文章推荐
php中$_REQUEST、$_POST、$_GET的区别和联系小结
Nov 23 PHP
php中字符集转换iconv函数使用总结
Oct 11 PHP
php实现监控varnish缓存服务器的状态
Dec 30 PHP
PHP常见错误提示含义解释(实用!值得收藏)
Apr 25 PHP
PHP编写daemon process 实例详解
Nov 13 PHP
PHP读取目录树的实现方法分析
Mar 22 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
Apr 17 PHP
YII2.0框架行为(Behavior)深入详解
Jul 26 PHP
php项目中类的自动加载实例讲解
Sep 12 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
Sep 30 PHP
PHP的Trait机制原理与用法分析
Oct 18 PHP
laravel 解决强制跳转 https的问题
Oct 22 PHP
解决Codeigniter不能上传rar和zip压缩包问题
Mar 07 #PHP
php 生成自动创建文件夹并上传文件的示例代码
Mar 07 #PHP
根据ip调用新浪api获取城市名并转成拼音
Mar 07 #PHP
体育彩票排列三组选三算法分享
Mar 07 #PHP
PHP错误和异长常处理总结
Mar 06 #PHP
php发送post请求函数分享
Mar 06 #PHP
PHP empty函数报错解决办法
Mar 06 #PHP
You might like
php4的彩蛋
2006/10/09 PHP
不错的一篇面向对象的PHP开发模式(简写版)
2007/03/15 PHP
让PHP COOKIE立即生效,不用刷新就可以使用
2011/03/09 PHP
PHP临时文件的安全性分析
2014/07/04 PHP
php实现简单四则运算器
2020/11/29 PHP
如何让您的中波更粗更长 - 中波框形天线制作
2021/03/10 无线电
jQuery-Easyui 1.2 实现多层菜单效果的代码
2012/01/13 Javascript
Javascript实现关联数据(Linked Data)查询及注意细节
2013/02/22 Javascript
Angularjs单选改为多选的开发过程及问题解析
2017/02/17 Javascript
Bootstrap的popover(弹出框)在append后弹不出(失效)
2017/02/27 Javascript
Bootstrap导航中表单简单实现代码
2017/03/06 Javascript
使用JS实现气泡跟随鼠标移动的动画效果
2017/09/16 Javascript
细说webpack源码之compile流程-入口函数run
2017/12/26 Javascript
mint-ui 时间插件使用及获取选择值的方法
2018/02/09 Javascript
JavaScript面向对象的程序设计(犯迷糊的小羊)
2018/05/27 Javascript
解决vue this.$forceUpdate() 处理页面刷新问题(v-for循环值刷新等)
2018/07/26 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
命令行批量截图Node脚本示例代码
2019/01/25 Javascript
jquery实现垂直无限轮播的方法分析
2019/07/16 jQuery
vue的路由映射问题及解决方案
2019/10/14 Javascript
JavaScript实现刮刮乐效果
2020/11/01 Javascript
Python模拟脉冲星伪信号频率实例代码
2018/01/03 Python
如何利用Python模拟GitHub登录详解
2019/07/15 Python
Python3 chardet模块查看编码格式的例子
2019/08/14 Python
wxPython实现文本框基础组件
2019/11/18 Python
HTML5中图片之间的缝隙完美解决方法
2017/07/07 HTML / CSS
经济实惠的豪华背包和行李袋:Packs Project
2018/10/17 全球购物
Haglöfs瑞典官方网站:haglofs火柴棍,欧洲顶级户外品牌
2018/10/18 全球购物
法律专业自我鉴定
2013/10/03 职场文书
奶茶专卖店创业计划书
2014/01/18 职场文书
商务日语专业毕业生自荐信
2014/03/27 职场文书
大学第二课堂活动总结
2014/07/08 职场文书
《周恩来的四个昼夜》观后思想汇报范文两篇
2014/09/10 职场文书
小学老师对学生的评语
2014/12/29 职场文书
大学生思想道德自我评价
2015/03/09 职场文书
pytorch中的torch.nn.Conv2d()函数图文详解
2022/02/28 Python