解析使用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 相关文章推荐
MVC模式的PHP实现
Oct 09 PHP
支持php4、php5的mysql数据库操作类
Jan 10 PHP
php新建文件自动编号的思路与实现
Jun 27 PHP
Php output buffering缓存及程序缓存深入解析
Jul 15 PHP
php json_encode值中大括号与花括号区别
Sep 30 PHP
php curl模拟post请求小实例
Nov 13 PHP
PHP 只允许指定IP访问(允许*号通配符过滤IP)
Jul 08 PHP
使用PHP实现微信摇一摇周边红包
Jan 04 PHP
Yii2搭建后台并实现rbac权限控制完整实例教程
Apr 28 PHP
Yii 2.0在Grid中格式化时间方法示例
Jun 06 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
Jul 07 PHP
PHP简单实现二维数组赋值与遍历功能示例
Oct 19 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 MemCached高级缓存配置图文教程
2010/08/05 PHP
再推荐十款免费的php开发工具
2015/11/09 PHP
Yii2使用swiftmailer发送邮件的方法
2016/05/03 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
2016/11/14 PHP
PHP实现打包下载文件的方法示例
2017/10/07 PHP
js实现连续英文字符自动换行兼容ie6 ie7和firefox
2013/09/06 Javascript
多种方法实现JS动态添加事件
2013/11/01 Javascript
JS常用正则表达式总结
2013/11/12 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
2014/06/23 Javascript
JavaScript设计模式经典之工厂模式
2016/02/24 Javascript
javascript HTML5 canvas实现打砖块游戏
2020/06/18 Javascript
jQuery中on绑定事件后引发的事件冒泡问题如何解决
2016/05/25 Javascript
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
jQuery对table表格进行增删改查
2020/12/22 Javascript
vue.js内部自定义指令与全局自定义指令的实现详解(利用directive)
2017/07/11 Javascript
完美解决axios跨域请求出错的问题
2018/02/05 Javascript
bootstrap table支持高度百分比的实例代码
2018/02/28 Javascript
vue中实现先请求数据再渲染dom分享
2018/03/17 Javascript
vue轮播组件实现$children和$parent 附带好用的gif录制工具
2019/09/26 Javascript
在vue中实现echarts随窗体变化
2020/07/27 Javascript
Nuxt的路由配置和参数传递方式
2020/11/06 Javascript
Python中实现结构相似的函数调用方法
2015/03/10 Python
深入理解python函数递归和生成器
2016/06/06 Python
python 异常处理总结
2016/10/18 Python
python3 selenium 切换窗口的几种方法小结
2018/05/21 Python
Python利用字典破解WIFI密码的方法
2019/02/27 Python
Django基础知识 URL路由系统详解
2019/07/18 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
2020/03/13 Python
详解anaconda离线安装pytorchGPU版
2020/09/08 Python
python实现xml转json文件的示例代码
2020/12/30 Python
详解HTML5中CSS外观属性
2020/09/10 HTML / CSS
HTML5实现移动端点击翻牌功能
2020/10/23 HTML / CSS
YSL圣罗兰美妆英国官网:Yves Saint Laurent Beauty UK
2019/08/03 全球购物
学生就业推荐信
2013/11/13 职场文书
网络维护中文求职信
2014/01/03 职场文书
新春联欢会主持词
2014/03/24 职场文书