解析使用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 相关文章推荐
CodeIgniter使用phpcms模板引擎
Nov 12 PHP
php ctype函数中文翻译和示例
Mar 21 PHP
PHP PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别
Nov 20 PHP
PHP7+Nginx的配置与安装教程详解
May 10 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
May 12 PHP
PHP简单实现循环链表功能示例
Nov 10 PHP
thinkphp5.1 文件引入路径问题及注意事项
Jun 13 PHP
PHP crypt()函数的用法讲解
Feb 15 PHP
ThinkPHP 5.x远程命令执行漏洞复现
Sep 23 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
Oct 10 PHP
Laravel 连接(Join)示例
Oct 16 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
Jun 02 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防止站外远程提交表单的方法
2014/10/20 PHP
php实现CSV文件导入和导出
2015/10/24 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
2018/04/20 PHP
PHP Include文件实例讲解
2019/02/15 PHP
关于Yii中模型场景的一些简单介绍
2019/09/22 PHP
Yii框架学习笔记之应用组件操作示例
2019/11/13 PHP
面向对象的编程思想在javascript中的运用上部
2009/11/20 Javascript
js中的this关键字详解
2013/09/25 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
2013/11/03 Javascript
让新消息在网页标题闪烁提示的jQuery代码
2013/11/04 Javascript
JavaScript使用replace函数替换字符串的方法
2015/04/06 Javascript
jquery实现键盘左右翻页特效
2015/04/30 Javascript
jQuery实现鼠标划过添加和删除class的方法
2015/06/26 Javascript
浅析jQuery Ajax请求参数和返回数据的处理
2016/02/24 Javascript
JavaScript String 对象常用方法详解
2016/05/13 Javascript
原生JS实现首页进度加载动画
2016/09/14 Javascript
使用Ajax生成的Excel文件并下载的实例
2016/11/21 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
2018/09/04 Javascript
详解使用Nuxt.js快速搭建服务端渲染(SSR)应用
2019/03/13 Javascript
vue-socket.io接收不到数据问题的解决方法
2020/05/13 Javascript
python自动格式化json文件的方法
2015/03/11 Python
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
2015/04/08 Python
详解Python的Django框架中的Cookie相关处理
2015/07/22 Python
python嵌套函数使用外部函数变量的方法(Python2和Python3)
2016/01/31 Python
Python在图片中添加文字的两种方法
2017/04/29 Python
Django中间件工作流程及写法实例代码
2018/02/06 Python
Python中循环引用(import)失败的解决方法
2018/04/22 Python
python 读取txt,json和hdf5文件的实例
2018/06/05 Python
python实现停车管理系统
2018/11/30 Python
python修改FTP服务器上的文件名
2019/09/11 Python
html5教程画矩形代码分享
2013/12/04 HTML / CSS
丝绸和人造花卉、植物和树木:Nearly Natural
2018/11/28 全球购物
可口可乐唇膏:Lip Smackers
2019/08/27 全球购物
大专会计自我鉴定
2014/02/06 职场文书
旅行社优秀创业计划书
2014/08/16 职场文书
婚礼双方父亲致辞
2015/07/27 职场文书