解析使用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 相关文章推荐
比file_get_contents稳定的curl_get_contents分享
Jan 11 PHP
php 无限级分类,超级简单的无限级分类,支持输出树状图
Jun 29 PHP
php+ajax实时刷新简单实例
Feb 25 PHP
PHP获取一段文本显示点阵宽度和高度的方法
Mar 12 PHP
PHP递归调用数组值并用其执行指定函数的方法
Apr 01 PHP
PHP实现加强版加密解密类实例
Jul 29 PHP
PHP使用mkdir创建多级目录的方法
Dec 22 PHP
php array_values 返回数组的所有值详解及实例
Nov 12 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
Feb 08 PHP
thinkPHP实现的省市区三级联动功能示例
May 05 PHP
实例分析基于PHP微信网页获取用户信息
Nov 24 PHP
php微信开发之图片回复功能
Jun 14 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中使用PDF文档功能
2006/10/09 PHP
php身份证号码检查类实例
2015/06/18 PHP
CodeIgniter多语言实现方法详解
2016/01/20 PHP
使用jQuery+HttpHandler+xml模拟一个三级联动的例子
2011/08/09 Javascript
JS在TextArea光标位置插入文字并实现移动光标到文字末尾
2013/06/21 Javascript
浅谈轻量级js模板引擎simplite
2015/02/13 Javascript
jquery append 动态添加的元素事件on 不起作用的解决方案
2015/07/30 Javascript
jQuery简单操作cookie的插件实例
2016/01/13 Javascript
Bootstrap3学习笔记(二)之排版
2016/05/20 Javascript
Angular 4环境准备与Angular cli创建项目详解
2017/05/27 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
JS图片预加载插件详解
2017/06/21 Javascript
vue滚动轴插件better-scroll使用详解
2017/10/17 Javascript
js控制随机数生成概率代码实例
2019/03/21 Javascript
JS常见面试试题总结【去重、遍历、闭包、继承等】
2019/08/27 Javascript
[54:25]Ti4 循环赛第三日LGD vs MOUZ
2014/07/12 DOTA
深入解析Python编程中super关键字的用法
2016/06/24 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
2018/03/05 Python
Python从Excel中读取日期一列的方法
2018/11/28 Python
Python 的AES加密与解密实现
2019/07/09 Python
Python 根据日志级别打印不同颜色的日志的方法示例
2019/08/08 Python
Python实现自定义读写分离代码实例
2019/11/16 Python
如何使用python实现模拟鼠标点击
2020/01/06 Python
python 实现汉诺塔游戏
2020/11/28 Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
2021/02/27 Python
html5构建触屏网站之网站尺寸探讨
2013/01/07 HTML / CSS
党课知识竞赛主持词
2014/04/01 职场文书
新春寄语大全
2014/04/09 职场文书
主题党日活动总结
2014/07/08 职场文书
2014年党员自我评议(5篇)
2014/09/12 职场文书
中学生旷课检讨书模板
2014/10/08 职场文书
医院办公室主任岗位职责
2015/04/01 职场文书
2015年党总支工作总结
2015/05/25 职场文书
教育读书笔记
2015/07/02 职场文书
《圆明园的毁灭》教学反思
2016/02/16 职场文书
深入探讨opencv图像矫正算法实战
2021/05/21 Python