详解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 相关文章推荐
Windows下PHP5和Apache的安装与配置
Sep 05 PHP
配置PHP使之能同时支持GIF和JPEG
Oct 09 PHP
解决phpmyadmin中文乱码问题。。。
Jan 18 PHP
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
Sep 30 PHP
PHP容易被忽略而出错陷阱 数字与字符串比较
Nov 10 PHP
浅析php中如何在有限的内存中读取大文件
Jul 02 PHP
php中eval函数的危害与正确禁用方法
Jun 30 PHP
完美的2个php检测字符串是否是utf-8编码函数分享
Jul 28 PHP
php下Memcached入门实例解析
Jan 05 PHP
PHP写的简单数字验证码实例
May 23 PHP
PHP单例模式与工厂模式详解
Aug 29 PHP
PHP7 字符串处理机制修改
Mar 09 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
解决phpmyadmin中文乱码问题。。。
2007/01/18 PHP
EasySlider 基于jQuery功能强大简单易用的滑动门插件
2010/06/11 Javascript
Jquery Ajax请求代码(2)
2011/01/07 Javascript
Js,alert出现乱码问题的解决方法
2013/06/19 Javascript
JavaScript设置首页和收藏页面的小例子
2013/11/11 Javascript
JS、CSS加载中的小问题探讨
2013/11/26 Javascript
原生js实现移动端瀑布流式代码示例
2015/12/18 Javascript
浅谈js图片前端预览之filereader和window.URL.createObjectURL
2016/06/30 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)
2016/12/02 Javascript
vue.js 上传图片实例代码
2017/06/22 Javascript
vue2.0的contextmenu右键弹出菜单的实例代码
2017/07/24 Javascript
微信小程序滑动选择器的实现代码
2018/08/10 Javascript
微信小程序云开发 生成带参小程序码流程
2019/05/18 Javascript
[02:09]抵达西雅图!中国军团加油!
2014/07/07 DOTA
简单理解Python中基于生成器的状态机
2015/04/13 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
2018/04/21 Python
int在python中的含义以及用法
2019/06/27 Python
python粘包问题及socket套接字编程详解
2019/06/29 Python
Python 使用matplotlib模块模拟掷骰子
2019/08/08 Python
python装饰器练习题及答案
2019/11/01 Python
CSS3中Transition动画属性用法详解
2016/07/04 HTML / CSS
HTML5自定义视频播放器源码
2020/01/06 HTML / CSS
加拿大廉价机票预订网站:CheapOair.ca
2018/03/04 全球购物
Timberland法国官网:购买靴子、鞋子、衣服、夹克和配饰
2019/11/30 全球购物
关于VPN
2012/06/10 面试题
初中体育教学反思
2014/01/14 职场文书
小学生元旦广播稿
2014/02/21 职场文书
环境保护建议书
2014/08/26 职场文书
离婚协议书的范本
2015/01/27 职场文书
运动会加油稿50字
2015/07/21 职场文书
2016暑期社会实践新闻稿
2015/11/25 职场文书
2016中秋节广告语
2016/01/28 职场文书
python基于opencv批量生成验证码的示例
2021/04/28 Python
Python中OpenCV实现查找轮廓的实例
2021/06/08 Python
Spring Boot 排除某个类加载注入IOC的操作
2021/08/02 Java/Android