浅析PHP中strlen和mb_strlen的区别


Posted in PHP onAugust 31, 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.

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

PHP 相关文章推荐
phpMyAdmin 安装及问题总结
May 28 PHP
php面向对象全攻略 (八)重载新的方法
Sep 30 PHP
php xml 入门学习资料
Jan 01 PHP
php判断终端是手机还是电脑访问网站的思路及代码
Apr 24 PHP
php 模拟 asp.net webFrom 按钮提交事件的思路及代码
Dec 02 PHP
php自定文件保存session的方法
Dec 10 PHP
Laravel 5框架学习之Blade 简介
Apr 08 PHP
php获取当前页面完整URL地址
Dec 30 PHP
PHP书写格式详解(必看)
May 23 PHP
php中html_entity_decode实现HTML实体转义
Jun 13 PHP
在Ubuntu 18.04上安装PHP 7.3 7.2和7.0的方法
Apr 09 PHP
浅谈laravel中的关联查询with的问题
Oct 10 PHP
PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
Aug 28 #PHP
PHP实现数组递归转义的方法
Aug 28 #PHP
PHP之autoload运行机制实例分析
Aug 28 #PHP
php+MySQL判断update语句是否执行成功的方法
Aug 28 #PHP
PHP反射机制用法实例
Aug 28 #PHP
PHP对象相互引用的内存溢出实例分析
Aug 28 #PHP
PHP对象递归引用造成内存泄漏分析
Aug 28 #PHP
You might like
受疫情影响 动画《Re从零开始的异世界生活》第二季延期至7月
2020/03/10 日漫
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
php 获取页面中指定内容的实现类
2014/01/23 PHP
destoon之一键登录设置
2014/06/21 PHP
PHP递归获取目录内所有文件的实现方法
2016/11/01 PHP
PHP编程实现计算抽奖概率算法完整实例
2017/08/09 PHP
Extjs学习笔记之六 面版
2010/01/08 Javascript
基于jquery+thickbox仿校内登录注册框
2010/06/07 Javascript
强大的jquery插件jqeuryUI做网页对话框效果!简单
2011/04/14 Javascript
页面回到顶部的三种实现(锚标记,js)
2012/10/01 Javascript
仿新浪微博登陆邮箱提示效果的js代码
2013/08/02 Javascript
jQuery之字体大小的设置方法
2014/02/27 Javascript
js实现无限级树形导航列表效果代码
2015/09/23 Javascript
JavaScript面试开发常用的知识点总结
2016/08/08 Javascript
javascript验证手机号和实现星号(*)代替实例
2016/08/16 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
vue 实现数字滚动增加效果的实例代码
2018/07/06 Javascript
微信小程序出现wx.getLocation再次授权问题的解决方法分析
2019/01/16 Javascript
Vue指令实现OutClick的示例
2020/11/16 Javascript
微信小程序实现天气预报功能(附源码)
2020/12/10 Javascript
[48:48]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Dream TIME
2014/05/21 DOTA
[03:17]2014DOTA2 国际邀请赛中国区预选赛 四强专访
2014/05/23 DOTA
[01:10:16]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第一局
2016/02/27 DOTA
解决Python出现_warn_unsafe_extraction问题的方法
2016/03/24 Python
基于python 处理中文路径的终极解决方法
2018/04/12 Python
python 读写文件,按行修改文件的方法
2018/07/12 Python
django框架CSRF防护原理与用法分析
2019/07/22 Python
Python如何使用argparse模块处理命令行参数
2019/12/11 Python
TensorFlow 多元函数的极值实例
2020/02/10 Python
详细分析Python垃圾回收机制
2020/07/01 Python
Python lambda表达式原理及用法解析
2020/08/18 Python
世界第一曲奇连锁店:Mrs. Fields Cookies
2017/02/04 全球购物
群众路线剖析材料
2014/02/02 职场文书
施工单位安全责任书
2014/07/24 职场文书
创先争优活动承诺书
2014/08/30 职场文书
Python内置数据类型中的集合详解
2022/03/18 Python