解析使用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中的观察者模式
Mar 24 PHP
php strstr查找字符串中是否包含某些字符的查找函数
Jun 03 PHP
php关于array_multisort多维数组排序的使用说明
Jan 04 PHP
Php连接及读取和写入mysql数据库的常用代码
Aug 11 PHP
php检测数组长度函数sizeof与count用法
Nov 17 PHP
php实现excel中rank函数功能的方法
Jan 20 PHP
PHP+AJAX实现投票功能的方法
Sep 28 PHP
对PHP依赖注入的理解实例分析
Oct 09 PHP
php实现查询功能(数据访问)
May 23 PHP
PHP面向对象多态性实现方法简单示例
Sep 27 PHP
thinkPHP5.1框架路由::get、post请求简单用法示例
May 06 PHP
php数值计算num类简单操作示例
May 15 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
ThinkPHP无限级分类原理实现留言与回复功能实例
2014/10/31 PHP
基于递归实现的php树形菜单代码
2014/11/19 PHP
php银联网页支付实现方法
2015/03/04 PHP
学习php设计模式 php实现原型模式(prototype)
2015/12/07 PHP
浅谈PHP中静态方法和非静态方法的相互调用
2016/10/04 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
web前端开发也需要日志
2010/12/09 Javascript
JSONP 跨域访问代理API-yahooapis实现代码
2012/12/02 Javascript
js检测浏览器版本、核心、是否移动端示例
2014/04/24 Javascript
被遗忘的javascript的slice() 方法
2015/04/20 Javascript
jquery实现简单实用的打分程序实例
2015/07/23 Javascript
浅谈JavaScript的全局变量与局部变量
2016/06/10 Javascript
js从数组中删除指定值(不是指定位置)的元素实现代码
2016/09/13 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
详解如何在React组件“外”使用父组件的Props
2018/01/12 Javascript
利用JS实现一个同Excel表现的智能填充算法
2018/08/13 Javascript
layer.close()关闭进度条和Iframe窗的方法
2018/08/17 Javascript
jQuery轻量级表单模型验证插件
2018/10/15 jQuery
js设置鼠标悬停改变背景色实现详解
2019/06/26 Javascript
使用vue for时为什么要key【推荐】
2019/07/11 Javascript
javascript头像上传代码实例
2019/09/28 Javascript
ES6 Promise对象概念及用法实例详解
2019/10/15 Javascript
vue项目中使用vue-layer弹框插件的方法
2020/03/11 Javascript
JS异步宏队列与微队列原理区别详解
2020/07/02 Javascript
python与C互相调用的方法详解
2017/07/14 Python
python实现随机森林random forest的原理及方法
2017/12/21 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
2018/09/25 Python
Python后台开发Django会话控制的实现
2019/04/15 Python
Python使用Numpy模块读取文件并绘制图片
2020/05/13 Python
html5简单示例_动力节点Java学院整理
2017/07/07 HTML / CSS
HTML5表单验证特性(知识点小结)
2020/03/10 HTML / CSS
俞敏洪一分钟演讲稿
2014/08/26 职场文书
授权委托书
2014/09/17 职场文书
交通事故赔偿协议书怎么写
2014/10/04 职场文书
Mysql数据库group by原理详解
2022/07/07 MySQL