解析使用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 相关文章推荐
frename PHP 灵活文件命名函数 frename
Sep 09 PHP
Admin generator, filters and I18n
Oct 06 PHP
php数组转换js数组操作及json_encode的用法详解
Oct 26 PHP
php实现的常见排序算法汇总
Sep 08 PHP
PHP安全下载文件的方法
Apr 07 PHP
php实现压缩合并js的方法【附demo源码下载】
Sep 22 PHP
php文件管理基本功能简单操作
Jan 16 PHP
CentOS 上搭建 PHP7 开发测试环境
Feb 26 PHP
老生常谈php中传统验证与thinkphp框架(必看篇)
Jun 10 PHP
php变量与JS变量实现不通过跳转直接交互的方法
Aug 25 PHP
PHP环形链表实现方法示例
Sep 15 PHP
PHP开发的文字水印,缩略图,图片水印实现类与用法示例
Apr 12 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
thinkphp视图模型查询提示ERR: 1146:Table 'db.pr_order_view' doesn't exist的解决方法
2014/10/30 PHP
Windows7下的php环境配置教程
2015/02/28 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
用js实现键盘方向键翻页功能的代码
2007/06/03 Javascript
下拉菜单点击实现连接跳转功能的js代码
2013/05/19 Javascript
理解js回收机制通俗易懂版
2016/02/29 Javascript
解决BootStrap Fileinput手机图片上传显示旋转问题
2017/06/01 Javascript
zTree jQuery 树插件的使用(实例讲解)
2017/09/25 jQuery
vue+springboot前后端分离实现单点登录跨域问题解决方法
2018/01/30 Javascript
小程序tab页无法传递参数的方法
2018/08/03 Javascript
浅谈vue中关于checkbox数据绑定v-model指令的个人理解
2018/11/14 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
react-router-dom 嵌套路由的实现
2020/05/02 Javascript
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
2015/03/05 Python
Python读写docx文件的方法
2018/05/08 Python
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
2018/10/11 Python
对Python闭包与延迟绑定的方法详解
2019/01/07 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
2019/02/13 Python
对Python3 pyc 文件的使用详解
2019/02/16 Python
python中 * 的用法详解
2019/07/10 Python
cProfile Python性能分析工具使用详解
2019/07/22 Python
关于阿里云oss获取sts凭证 app直传 python的实例
2019/08/20 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
2020/01/09 Python
Python实现Wordcloud生成词云图的示例
2020/03/30 Python
Python偏函数Partial function使用方法实例详解
2020/06/17 Python
10个python爬虫入门实例(小结)
2020/11/01 Python
Python 利用argparse模块实现脚本命令行参数解析
2020/12/28 Python
CSS3教程(3):border-color网页边框色彩
2009/04/02 HTML / CSS
CSS3.0实现霓虹灯按钮动画特效的示例代码
2021/01/12 HTML / CSS
浅谈HTML5新增和废弃的标签
2019/04/28 HTML / CSS
企业厂长岗位职责
2013/12/17 职场文书
三年级语文教学反思
2014/02/01 职场文书
村党支部书记承诺书
2014/05/29 职场文书
装饰施工员岗位职责
2015/04/11 职场文书
2016五一手机促销广告语
2016/01/28 职场文书
如何使用注解方式实现 Redis 分布式锁
2022/07/23 Redis