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 相关文章推荐
用ODBC的分页显示
Oct 09 PHP
php Undefined index和Undefined variable的解决方法
Mar 27 PHP
一些 PHP 管理系统程序中的后门
Aug 05 PHP
将一维或多维的数组连接成一个字符串的php代码
Aug 08 PHP
Thinkphp模板中使用自定义函数的方法
Sep 23 PHP
PHP删除非空目录的函数代码小结
Feb 28 PHP
hadoop中一些常用的命令介绍
Jun 19 PHP
如何在Ubuntu下启动Apache的Rewrite功能
Jul 05 PHP
php遍历目录与文件夹的多种方法详解
Nov 14 PHP
PHP中文字符串截断无乱码解决方法
Oct 10 PHP
form表单传递数组数据、php脚本接收的实例
Feb 09 PHP
浅谈PHP array_search 和 in_array 函数效率问题
Oct 15 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自定义函数返回多个值
2006/11/26 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
2016/08/17 PHP
php操作路径的经典方法(必看篇)
2016/10/04 PHP
php通过会话控制实现身份验证实例
2016/10/18 PHP
Using the TextRange Object
2006/10/14 Javascript
jQuery基本选择器选择元素使用介绍
2013/04/18 Javascript
详解AngularJS中自定义过滤器
2015/12/28 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
2016/02/18 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
2016/06/22 Javascript
AngularJS入门教程之REST和定制服务详解
2016/08/19 Javascript
JS实现Ajax的方法分析
2016/12/20 Javascript
微信小程序图表插件(wx-charts)实例代码
2017/01/17 Javascript
JavaScript中从setTimeout与setInterval到AJAX异步
2017/02/13 Javascript
深入浅析Vue.js 中的 v-for 列表渲染指令
2018/11/19 Javascript
微信小程序设置全局请求URL及封装wx.request请求操作示例
2019/04/02 Javascript
Element图表初始大小及窗口自适应实现
2020/07/10 Javascript
详解Python迭代和迭代器
2016/03/28 Python
python模拟事件触发机制详解
2018/01/19 Python
Python字符串的修改方法实例
2019/12/19 Python
Django中ORM找出内容不为空的数据实例
2020/05/20 Python
PyCharm2019 安装和配置教程详解附激活码
2020/07/31 Python
html5 input属性使用示例
2013/06/28 HTML / CSS
使用phonegap获取位置信息的实现方法
2017/03/31 HTML / CSS
美国演唱会订票网站:Ticketmaster美国
2017/10/05 全球购物
全球游戏Keys和卡片市场:GamesDeal
2018/03/28 全球购物
UNIX文件系统常用命令
2012/05/25 面试题
幼儿教师考核制度
2014/01/25 职场文书
产品开发计划书
2014/04/27 职场文书
揭牌仪式策划方案
2014/05/28 职场文书
出国签证在职证明
2014/09/20 职场文书
作风建设剖析材料
2014/10/06 职场文书
村党支部书记四风问题个人对照检查材料思想汇报
2014/10/06 职场文书
党的群众路线教育实践活动个人整改措施落实情况
2014/11/04 职场文书
晚会开幕词
2015/01/28 职场文书
Django模型层实现多表关系创建和多表操作
2021/07/21 Python
MYSQL优化之数据表碎片整理详解
2022/04/03 MySQL