解析使用substr截取UTF-8中文字符串出现乱码的问题


Posted in PHP onJune 20, 2013

我们知道有时候使用substr来截取UTF-8中文字符串的时候,经常会出现乱码,为什么会出现这样的问题呢,本文告诉你答案。
看这样一段代码吧(字符编码为UTF-8):

<?
$str = '都知道strlen与mb_strlen是求字符串长度的函数';
echo strlen($str)'.<br />'.mb_strlen($str,'utf-8');
?>

运行上述代码,返回值如下:
66
34
怎么样?strlen中,中文是三个字节的长度,英文则是一个字节的长度!mb_strlen中,都被计算为一字节的长度!所以,我们有时候用substr来截取UTF-8中文字符串的时候,经常会出现乱码,就是这个原因了!
下面提供一个截取UTF-8字符串的函数:
function cutstr($sourcestr,$cutlength){
$returnstr = '';
$i = 0;
$n = 0;
$str_length = strlen($sourcestr);
$mb_str_length = mb_strlen($sourcestr,'utf-8');
while(($n < $cutlength) && ($i <= $str_length)){
$temp_str = substr($sourcestr,$i,1);
$ascnum = ord($temp_str);
if($ascnum >= 224){
$returnstr = $returnstr.substr($sourcestr,$i,3);
$i = $i + 3;
$n++;
}
elseif($ascnum >= 192){
$returnstr = $returnstr.substr($sourcestr,$i,2);
$i = $i + 2;
$n++;
}
elseif(($ascnum >= 65) && ($ascnum <= 90)){
$returnstr = $returnstr.substr($sourcestr,$i,1);
$i = $i + 1;
$n++;
}
else{
$returnstr = $returnstr.substr($sourcestr,$i,1);
$i = $i + 1;
$n = $n + 0.5;
}
}
if ($mb_str_length > $cutlength){
$returnstr = $returnstr . "...";
}
return $returnstr; 
}

使用例子:
<?
$str = '有效期最长三个月,超过有效期系统将自动删除本条信息';
//echo strlen($str);
//echo '<hr />'.mb_strlen($str,'utf-8');
echo '<hr />'.$str;
echo '<hr />'.cutstr($str,24);
?>
PHP 相关文章推荐
PHP模板引擎SMARTY
Oct 09 PHP
用Apache反向代理设置对外的WWW和文件服务器
Oct 09 PHP
PHP脚本的10个技巧(6)
Oct 09 PHP
用PHP为SHOPEX增加日志功能代码
Jul 02 PHP
如何使用“PHP” 彩蛋进行敏感信息获取
Aug 07 PHP
ThinkPHP基于PHPExcel导入Excel文件的方法
Oct 15 PHP
PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法
Mar 07 PHP
PHP常用处理静态操作类
Apr 03 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
Sep 15 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 PHP
PHP性能测试工具xhprof安装与使用方法详解
Apr 29 PHP
PDO::beginTransaction讲解
Jan 27 PHP
用Json实现PHP与JavaScript间数据交换的方法详解
Jun 20 #PHP
使用php 获取时间今天明天昨天时间戳的详解
Jun 20 #PHP
探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解
Jun 20 #PHP
解析yii数据库的增删查改
Jun 20 #PHP
在yii中新增一个用户验证的方法详解
Jun 20 #PHP
浅析Yii中使用RBAC的完全指南(用户角色权限控制)
Jun 20 #PHP
php中0,null,empty,空,false,字符串关系的详细介绍
Jun 20 #PHP
You might like
php+jquery编码方面的一些心得(utf-8 gb2312)
2010/10/12 PHP
解析php开发中的中文编码问题
2013/08/08 PHP
PHP在网页中动态生成PDF文件详细教程
2014/07/05 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
(推荐一个超好的JS函数库)S.Sams Lifexperience ScriptClassLib
2007/04/29 Javascript
javascript中parentNode,childNodes,children的应用详解
2013/12/17 Javascript
ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox
2014/05/02 Javascript
JavaScript访问CSS属性的几种方式介绍
2014/07/21 Javascript
jQuery截取指定长度字符串代码
2014/08/21 Javascript
jquery实现LED广告牌旋转系统图片切换效果代码分享
2015/08/26 Javascript
javascript的函数劫持浅析
2016/09/26 Javascript
微信小程序(应用号)开发新闻客户端实例
2016/10/24 Javascript
JS中Array数组学习总结
2017/01/18 Javascript
Angularjs处理页面闪烁的解决方法
2017/03/09 Javascript
jQuery选择器之子元素过滤选择器
2017/09/28 jQuery
JS实现websocket长轮询实时消息提示的效果
2017/10/10 Javascript
React Native AsyncStorage本地存储工具类
2017/10/24 Javascript
nodejs前端模板引擎swig入门详解
2018/05/15 NodeJs
解决koa2 ctx.render is not a function报错问题
2018/08/07 Javascript
CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
2019/06/14 Javascript
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
[19:54]夜魇凡尔赛茶话会 第一期02:看图识人
2021/03/11 DOTA
跟老齐学Python之传说中的函数编写条规
2014/10/11 Python
Python下简易的单例模式详解
2019/04/08 Python
django和vue实现数据交互的方法
2019/08/21 Python
使用Python爬虫库requests发送表单数据和JSON数据
2020/01/25 Python
Python基于requests实现模拟上传文件
2020/04/21 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
2021/01/28 Python
python爬虫scrapy框架之增量式爬虫的示例代码
2021/02/26 Python
医务工作者先进事迹材料
2014/01/26 职场文书
中介公司区域经理岗位职责范本
2014/03/02 职场文书
激励口号大全
2014/06/17 职场文书
2014年质检员工作总结
2014/11/18 职场文书
Django实现聊天机器人
2021/05/31 Python
Java中使用Filter过滤器的方法
2021/06/28 Java/Android
一篇文章弄懂Python关键字、标识符和变量
2021/07/15 Python