解析使用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模板的朋友必看的很多个顶级PHP模板引擎比较分析
May 26 PHP
PHP中如何实现常用邮箱的基本判断
Jan 07 PHP
ThinkPHP CURD方法之limit方法详解
Jun 18 PHP
php查询mysql数据库并将结果保存到数组的方法
Mar 18 PHP
php求数组全排列,元素所有组合的方法
May 05 PHP
Yii2.0 模态弹出框+ajax提交表单
May 22 PHP
php版微信自动登录并获取昵称的方法
Sep 23 PHP
php使用SAE原生Mail类实现各种类型邮件发送的方法
Oct 10 PHP
php5.3后静态绑定用法详解
Nov 11 PHP
关于PHP内置的字符串处理函数详解
Feb 04 PHP
PHP批量删除jQuery操作
Jul 23 PHP
PHP类的自动加载与命名空间用法实例分析
Jun 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 异常处理实现代码
2009/03/10 PHP
PHP 计算代码执行耗时的代码修正网上普遍错误
2011/05/14 PHP
根据一段代码浅谈Javascript闭包
2010/12/14 Javascript
jQuery1.6 使用方法一
2011/11/23 Javascript
基于jquery实现点击左右按钮图片横向滚动
2013/04/11 Javascript
修改file按钮的默认样式实现代码
2013/04/23 Javascript
JS对HTML标签select的获取、添加、删除操作
2013/10/17 Javascript
JavaScript中String.match()方法的使用详解
2015/06/06 Javascript
javascript生成大小写字母
2015/07/03 Javascript
全面了解javascript中的错误处理机制
2016/07/18 Javascript
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
2017/09/07 Javascript
vue系列之requireJs中引入vue-router的方法
2018/07/18 Javascript
python实现向ppt文件里插入新幻灯片页面的方法
2015/04/28 Python
Python中的defaultdict与__missing__()使用介绍
2018/02/03 Python
Python手绘可视化工具cutecharts使用实例
2019/12/05 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
2020/01/09 Python
Django接收照片储存文件的实例代码
2020/03/07 Python
python实现扑克牌交互式界面发牌程序
2020/04/22 Python
python小技巧——将变量保存在本地及读取
2020/11/13 Python
pycharm 复制代码出现空格的解决方式
2021/01/15 Python
python中PyQuery库用法分享
2021/01/15 Python
Python爬虫回测股票的实例讲解
2021/01/22 Python
芝加哥牛排公司:Chicago Steak Company
2018/10/31 全球购物
Doyoueven官网:澳大利亚健身服饰和配饰品牌
2019/03/24 全球购物
Shopee菲律宾:在线购买和出售
2019/11/25 全球购物
Strathberry苏贝瑞中国官网:西班牙高级工匠手工打造
2020/10/19 全球购物
大专应届生个人的自我评价
2013/11/21 职场文书
民族团结先进个人事迹材料
2014/06/02 职场文书
宣传标语大全
2014/07/01 职场文书
2014年人事行政工作总结
2014/12/03 职场文书
病危通知单
2015/04/17 职场文书
2016年党员学习廉政准则心得体会
2016/01/20 职场文书
详解Mysql 函数调用优化
2021/04/07 MySQL
用python批量解压带密码的压缩包
2021/05/31 Python
Python基于百度AI实现抓取表情包
2021/06/27 Python
部分武汉产收音机展览
2022/04/07 无线电