解析使用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分页函数
Jul 08 PHP
简单的过滤字符串中的HTML标记
Dec 25 PHP
php print EOF实现方法
May 21 PHP
php设计模式 Composite (组合模式)
Jun 26 PHP
PHP合并静态文件详解
Nov 14 PHP
php5.4以下版本json不支持不转义内容中文的解决方法
Jan 13 PHP
php生成PDF格式文件并且加密
Jun 22 PHP
详解PHP中的mb_detect_encoding函数使用方法
Aug 18 PHP
PHP生成随机字符串(3种方法)
Sep 25 PHP
部署PHP时的4个配置修改说明
Oct 19 PHP
php变量与数组相互转换的方法(extract与compact)
Dec 02 PHP
PHP中类与对象功能、用法实例解读
Mar 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连接MySQL查询结果中文显示乱码解决方法
2013/10/25 PHP
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子
2014/05/10 PHP
javascript设计模式 封装和信息隐藏(上)
2012/07/24 Javascript
IE中jquery.form中ajax提交没反应解决方法分享
2012/09/11 Javascript
jquery获取自定义属性(attr和prop)实例介绍
2013/04/21 Javascript
jquery dialog open后,服务器端控件失效的快速解决方法
2013/12/19 Javascript
利用jQuery简单实现产品展示图片左右滚动功能(示例代码)
2014/01/02 Javascript
jquery中get和post的简单实例
2014/02/04 Javascript
js获取日期:昨天今天和明天、后天
2014/06/11 Javascript
Node.js 学习笔记之简介、安装及配置
2015/03/03 Javascript
js实现遍历含有input的table实例
2015/12/07 Javascript
分享javascript计算时间差的示例代码
2020/03/19 Javascript
AngularJs 动态加载模块和依赖
2016/09/15 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
2018/12/06 Javascript
详解element-ui中el-select的默认选择项问题
2019/08/02 Javascript
JS实现json数组排序操作实例分析
2019/10/28 Javascript
基于js实现判断浏览器类型代码实例
2020/07/17 Javascript
在Vue 中实现循环渲染多个相同echarts图表
2020/07/20 Javascript
[33:09]完美世界DOTA2联赛循环赛 Forest vs DM BO2第二场 10.29
2020/10/29 DOTA
python分析nignx访问日志脚本分享
2015/02/26 Python
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
使用Python求解最大公约数的实现方法
2015/08/20 Python
Python批量查询域名是否被注册过
2017/06/21 Python
Python基于numpy灵活定义神经网络结构的方法
2017/08/19 Python
python实现串口自动触发工作的示例
2019/07/02 Python
Python实现二叉树的最小深度的两种方法
2019/09/30 Python
Django filter动态过滤与排序实现过程解析
2020/11/26 Python
深入了解canvas在移动端绘制模糊的问题解决
2019/04/30 HTML / CSS
英国男女奢华内衣和泳装购物网站:Figleaves
2017/01/28 全球购物
意大利在线高尔夫商店:Online Golf
2021/03/09 全球购物
绘画专业自荐信范文
2014/02/23 职场文书
财务人员的自我评价范文
2014/03/03 职场文书
2014迎接教师节演讲稿
2014/09/10 职场文书
部门优秀员工推荐信
2015/03/24 职场文书
起诉书格式范文
2015/05/20 职场文书
Win11开始菜单添加休眠选项
2022/04/19 数码科技