解析使用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逐行输出(ob_flush与flush的组合)
Feb 04 PHP
PHP容易忘记的知识点分享
Apr 30 PHP
PHP文件缓存内容保存格式实例分析
Aug 20 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
Oct 15 PHP
浅谈PHP中Stream(流)
Jun 08 PHP
详解WordPress开发中用于获取分类及子页面的函数用法
Jan 08 PHP
PHP实现上传图片到 zimg 服务器
Oct 19 PHP
ThinkPHP框架实现数据增删改
May 07 PHP
Laravel 的数据库迁移的方法
Jul 31 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
Feb 23 PHP
Yii框架 session 数据库存储操作方法示例
Nov 18 PHP
php的RSA加密解密算法原理与用法分析
Jan 23 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笔记之:文章中图片处理的使用
2013/04/26 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
在laravel中使用with实现动态添加where条件
2019/10/10 PHP
js 屏蔽鼠标右键脚本附破解方法
2009/12/03 Javascript
深入理解JavaScript系列(47):对象创建模式(上篇)
2015/03/04 Javascript
jQuery对象的链式操作用法分析
2016/05/10 Javascript
微信小程序 轮播图swiper详解及实例(源码下载)
2017/01/11 Javascript
jquery实现用户登陆界面(示例讲解)
2017/09/06 jQuery
详解基于Vue cli生成的Vue项目的webpack4升级
2018/06/19 Javascript
在微信小程序中渲染HTML内容的方法示例
2018/09/28 Javascript
微信小程序关键字变色实现代码实例
2019/12/13 Javascript
详解vue-router的Import异步加载模块问题的解决方案
2020/05/13 Javascript
JS加载解析Markdown文档过程详解
2020/05/19 Javascript
如何实现vue的tree组件
2020/12/03 Vue.js
[02:40]2018年度DOTA2最佳新人-完美盛典
2018/12/16 DOTA
[01:07:02]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第三场 2月26日
2021/03/11 DOTA
python网络编程学习笔记(三):socket网络服务器
2014/06/09 Python
Python标准库内置函数complex介绍
2014/11/25 Python
Python中使用dom模块生成XML文件示例
2015/04/05 Python
Python实现给qq邮箱发送邮件的方法
2015/05/28 Python
python控制台中实现进度条功能
2015/11/10 Python
浅谈python 四种数值类型(int,long,float,complex)
2016/06/08 Python
numpy中的delete删除数组整行和整列的实例
2018/05/09 Python
如何安装并使用conda指令管理python环境
2019/07/10 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
2020/06/17 Python
浅谈Python中的继承
2020/06/19 Python
Europcar葡萄牙:葡萄牙汽车和货车租赁
2017/10/13 全球购物
澳大利亚最大的网上油画销售画廊:Direct Art Australia
2018/04/15 全球购物
Fossil加拿大官网:化石手表、手袋、首饰及配饰
2019/04/23 全球购物
本科生求职信
2014/06/17 职场文书
委托证明书
2014/09/17 职场文书
公司给客户的感谢信
2015/01/23 职场文书
优秀毕业生主要事迹材料
2015/11/04 职场文书
学生会宣传部竞选稿
2015/11/21 职场文书
jdbc中自带MySQL 连接池实践示例
2022/07/23 MySQL
CSS中理解层叠性及权重如何分配
2022/12/24 HTML / CSS