解析使用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 相关文章推荐
基于mysql的论坛(1)
Oct 09 PHP
PHP 向右侧拉菜单实现代码,测试使用中
Nov 03 PHP
php &amp;&amp; 逻辑与运算符使用说明
Mar 04 PHP
用Zend Studio+PHPnow+Zend Debugger搭建PHP服务器调试环境步骤
Jan 19 PHP
php中函数前加&amp;符号的作用分解
Jul 08 PHP
PHP实现事件机制的方法
Jul 10 PHP
PHP mysql事务问题实例分析
Jan 18 PHP
php生成txt文件实例代码介绍
Apr 28 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
Aug 20 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
Feb 11 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 PHP
php使用Swoole实现毫秒级定时任务的方法
Sep 04 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 版本]
2007/03/20 PHP
PHP动态生成javascript文件的2个例子
2014/04/11 PHP
简单谈谈favicon
2015/06/10 PHP
深入解析PHP的Yii框架中的缓存功能
2016/03/29 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
Yii 访问 Gii(脚手架)时出现 403 错误
2018/06/06 PHP
jquery如何实现锚点链接之间的平滑滚动
2013/12/02 Javascript
Javascript中匿名函数的多种调用方式总结
2013/12/06 Javascript
用C/C++来实现 Node.js 的模块(二)
2014/09/24 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 图片库
2015/01/09 Javascript
高效利用Angular中内置服务$http、$location等
2016/03/22 Javascript
jQuery 3.0十大新特性
2016/07/06 Javascript
AngularJs ng-route路由详解及实例代码
2016/09/14 Javascript
学习vue.js计算属性
2016/12/03 Javascript
AngularJS指令与控制器之间的交互功能示例
2016/12/14 Javascript
Bootstrap Table 删除和批量删除
2017/09/22 Javascript
JS实现图片上传多次上传同一张不生效的处理方法
2018/08/06 Javascript
详解vue中使用vue-quill-editor富文本小结(图片上传)
2019/04/24 Javascript
详解wepy开发小程序踩过的坑(小结)
2019/05/22 Javascript
实例详解带参数的 npm script
2019/05/28 Javascript
js神秘的电报密码 哈弗曼编码实现
2019/09/10 Javascript
node 文件上传接口的转发的实现
2019/09/23 Javascript
Vue+webpack实现懒加载过程解析
2020/02/17 Javascript
vue中使用v-for时为什么不能用index作为key
2020/04/04 Javascript
[02:30]DOTA2放量测试专访海涛:呼吁保护新手玩家
2013/08/26 DOTA
python实现在控制台输入密码不显示的方法
2015/07/02 Python
探究python中open函数的使用
2016/03/01 Python
基于Django用户认证系统详解
2018/02/21 Python
python爬取网页内容转换为PDF文件
2020/07/28 Python
Linux常见面试题
2016/10/04 面试题
工作作风懒散检讨书
2014/10/29 职场文书
语文复习计划
2015/01/19 职场文书
2015年仓库管理员工作总结
2015/04/21 职场文书
离婚承诺书格式范文
2015/05/04 职场文书
MySQL 1130异常,无法远程登录解决方案详解
2021/08/23 MySQL
Python matplotlib绘制条形统计图 处理多个实验多组观测值
2022/04/21 Python