解析使用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语法速查表
Jan 02 PHP
PHP获取网卡地址的代码
Apr 09 PHP
一个比较简单的PHP 分页分组类
Dec 10 PHP
解决file_get_contents无法请求https连接的方法
Dec 17 PHP
免费的ip数据库淘宝IP地址库简介和PHP调用实例
Apr 08 PHP
9条PHP编程小知识及易犯的小错误
Jan 22 PHP
php 截取utf-8格式的字符串实例代码
Oct 30 PHP
PHP实现RTX发送消息提醒的实例代码
Jan 03 PHP
PHP中in_array的隐式转换的解决方法
Mar 06 PHP
thinkphp5.1 文件引入路径问题及注意事项
Jun 13 PHP
PHP微信发送推送消息乱码的解决方法
Feb 28 PHP
Mac下快速搭建PHP开发环境步骤详解
May 05 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的历史和优缺点
2006/10/09 PHP
PHP Google的translate API代码
2008/12/10 PHP
php购物网站支付paypal使用方法
2010/11/28 PHP
php封装好的人民币数值转中文大写类
2015/12/20 PHP
java模拟PHP的pack和unpack类
2016/04/13 PHP
jQuery 1.5 源码解读 面向中高阶JSER
2011/04/05 Javascript
jQuery简单图表peity.js使用示例
2014/05/02 Javascript
JavaScript中标识符提升问题
2015/06/11 Javascript
常见JS验证脚本汇总
2015/12/01 Javascript
基于javascript实现彩票随机数生成(升级版)
2020/04/17 Javascript
JQuery+EasyUI轻松实现步骤条效果
2016/02/22 Javascript
javascript RegExp 使用说明
2016/05/21 Javascript
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
JS实现的系统调色板完整实例
2016/12/21 Javascript
javascript实现文字无缝滚动
2016/12/27 Javascript
vue组件学习教程
2017/09/09 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
2018/03/13 Javascript
vue项目关闭eslint校验
2018/03/21 Javascript
基于Vue实现拖拽效果
2018/04/27 Javascript
Vue axios设置访问基础路径方法
2018/09/19 Javascript
uni-app 支持多端第三方地图定位的方法
2020/01/03 Javascript
Django框架中数据的连锁查询和限制返回数据的方法
2015/07/17 Python
详解如何用OpenCV + Python 实现人脸识别
2017/10/20 Python
python+matplotlib绘制饼图散点图实例代码
2018/01/20 Python
Python模块搜索路径代码详解
2018/01/29 Python
解决matplotlib库show()方法不显示图片的问题
2018/05/24 Python
python飞机大战pygame游戏之敌机出场实现方法详解
2019/12/17 Python
python接口自动化之ConfigParser配置文件的使用详解
2020/08/03 Python
python 如何调用 dubbo 接口
2020/09/24 Python
详解python爬取弹幕与数据分析
2020/11/14 Python
英国在线汽车和面包车零件商店:Car Parts 4 Less
2018/08/15 全球购物
共产党员公开承诺践诺书
2014/05/28 职场文书
2014年团工作总结
2014/11/27 职场文书
指导老师鉴定意见
2015/06/05 职场文书
Python一行代码实现自动发邮件功能
2021/05/30 Python
浅谈Python中对象是如何被调用的
2022/04/06 Python