解析使用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里的JS打印函数
Oct 09 PHP
如何过滤高亮显示非法字符
Oct 09 PHP
超级简单的php+mysql留言本源码
Nov 11 PHP
腾讯QQ php程序员面试题目整理
Jun 08 PHP
解决ajax+php中文乱码的方法详解
Jun 09 PHP
基于PHP读取csv文件内容的详解
Jun 18 PHP
phpQuery占用内存过多的处理方法
Nov 13 PHP
php中AES加密解密的例子小结
Feb 18 PHP
thinkphp的静态缓存用法分析
Nov 29 PHP
PHP命令行执行整合pathinfo模拟定时任务实例
Aug 12 PHP
Laravel 队列使用的实现
Jan 08 PHP
PHP使用PDO 连接与连接管理操作实例分析
Apr 21 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+java实现自动新闻滚动窗口
2006/10/09 PHP
Banner程序
2006/10/09 PHP
php daodb插入、更新与删除数据
2009/03/19 PHP
PHP 压缩文件夹的类代码
2009/11/05 PHP
php使用异或实现的加密解密实例
2013/09/04 PHP
PHP中可以自动分割查询字符的Parse_str函数使用示例
2014/07/25 PHP
php实现window平台的checkdnsrr函数
2015/05/27 PHP
Mootools 1.2教程 滚动条(Slider)
2009/09/15 Javascript
jquery png 透明解决方案(推荐)
2010/08/21 Javascript
nodejs获取本机内网和外网ip地址的实现代码
2014/06/01 NodeJs
使用AngularJS实现表单向导的方法
2015/06/19 Javascript
2016年最热门的15 款代码语法高亮工具,美化你的代码
2016/01/06 Javascript
【JS+CSS3】实现带预览图幻灯片效果的示例代码
2016/03/17 Javascript
javascript中错误使用var造成undefined
2016/03/31 Javascript
详解Bootstrap的iCheck插件checkbox和radio
2016/08/24 Javascript
关于List.ToArray()方法的效率测试
2016/09/30 Javascript
基于Bootstrap表单验证功能
2017/11/17 Javascript
微信小程序图片选择区域裁剪实现方法
2017/12/02 Javascript
微信小程序动态生成二维码的实现代码
2018/07/25 Javascript
layUI的验证码功能及校验实例
2019/10/25 Javascript
Vue自定义指令结合阿里云OSS优化图片的实现方法
2019/11/12 Javascript
vue3为什么要用proxy替代defineProperty
2020/10/19 Javascript
Python通过递归遍历出集合中所有元素的方法
2015/02/25 Python
Python实现小数转化为百分数的格式化输出方法示例
2017/09/20 Python
python cx_Oracle的基础使用方法(连接和增删改查)
2017/11/19 Python
对Python _取log的几种方式小结
2019/07/25 Python
python中with语句结合上下文管理器操作详解
2019/12/19 Python
python3.9.1环境安装的方法(图文)
2021/02/02 Python
期中考试后的反思
2014/02/08 职场文书
安全生产中长期规划实施方案
2014/02/21 职场文书
父母寄语大全
2014/04/12 职场文书
交通事故赔偿协议书范本
2014/04/15 职场文书
家长通知书家长评语
2014/04/17 职场文书
大学第二课堂活动总结
2014/07/08 职场文书
搞笑婚礼主持词开场白
2015/11/24 职场文书
pytorch中的model.eval()和BN层的使用
2021/05/22 Python