解析使用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 相关文章推荐
服务器web工具 php环境下
Dec 29 PHP
Eclipse中php插件安装及Xdebug配置的使用详解
Apr 25 PHP
php实现文件下载实例分享
Jun 02 PHP
php的dl函数用法实例
Nov 06 PHP
php一行代码获取文件后缀名实例分析
Nov 12 PHP
PHP实现图片上传并压缩
Dec 22 PHP
PHP-CGI远程代码执行漏洞分析与防范
May 07 PHP
Thinkphp自定义生成缩略图尺寸的方法
Aug 05 PHP
laravel框架实现去掉URL中index.php的方法
Oct 12 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
Dec 18 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
Jan 22 PHP
PHP7 整型处理机制修改
Mar 09 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
微信公众平台接口开发入门示例
2014/12/24 PHP
php错误日志简单配置方法
2016/07/11 PHP
Js四则运算函数代码
2012/07/21 Javascript
jquery ui bootstrap 实现自定义风格
2014/11/14 Javascript
jQuery选择器源码解读(八):addCombinator函数
2015/03/31 Javascript
Node.js事件驱动
2015/06/18 Javascript
jQuery向父辈遍历的简单方法
2016/09/18 Javascript
从零学习node.js之文件操作(三)
2017/02/21 Javascript
在vue里使用codemirror遇到的问题
2018/11/01 Javascript
微信小程序实现收货地址左滑删除
2020/11/18 Javascript
如何在Vue中抽离接口配置文件
2019/10/31 Javascript
JavaScript中的this/call/apply/bind的使用及区别
2020/03/06 Javascript
[02:52]DOTA2新手基础教程 米波
2014/01/21 DOTA
Python入门篇之函数
2014/10/20 Python
Python文件处理
2016/02/29 Python
对python实时得到鼠标位置的示例讲解
2018/10/14 Python
python网络应用开发知识点浅析
2019/05/28 Python
浅谈PySpark SQL 相关知识介绍
2019/06/14 Python
Python列表与元组的异同详解
2019/07/02 Python
python jenkins 打包构建代码的示例代码
2019/11/29 Python
python 创建一维的0向量实例
2019/12/02 Python
pytorch中的inference使用实例
2020/02/20 Python
Python3.7下安装pyqt5的方法步骤(图文)
2020/05/12 Python
用python写PDF转换器的实现
2020/10/29 Python
Python爬虫之Selenium下拉框处理的实现
2020/12/04 Python
澳大利亚最超值的自行车之家:Reid Cycles
2019/03/24 全球购物
一组SQL面试题
2016/02/15 面试题
终止劳动合同协议书
2014/04/14 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
推广普通话共筑中国梦演讲稿
2014/09/21 职场文书
期末复习计划
2015/01/19 职场文书
广播体操比赛主持词
2015/06/29 职场文书
结婚典礼主持词
2015/06/29 职场文书
教师研修随笔感言
2015/11/18 职场文书
2016年暑假家长对孩子评语
2015/12/01 职场文书
JavaScript原型链详解
2021/11/07 Javascript