PHP中实现中文字串截取无乱码的解决方法


Posted in PHP onMay 29, 2018

在PHP中,substr()函数截取带有中文字符串的话,可能会出现乱码,这是因为中西文一个字节所占有的字节数不一样,而substr的长度参数是按照字节去算的,在GB2312编码时,一个中文占2个字节,英文为1个字节,而在UTF-8编码当中,一个中文可能占有2个或3个字节,英文或半角标点占1字节。

直接使用PHP函数substr截取中文字符可能会出现乱码,主要是substr可能硬生生的将一个中文字符“锯”成两半。解决办法:

1、使用mbstring扩展库的mb_substr截取就不会出现乱码了。

2、自己书写截取函数,但效率不如用mbstring扩展库来得高。

3、如果仅是为了输出截取的串,可用如下方式实现:substr($str, 0, 30).chr(0)。

=============================

substr()函数可以分割文字,但要分割的文字如果包括中文字符往往会遇到问题,这时可以用mb_substr()/mb_strcut这个函数,mb_substr()/mb_strcut的用法与substr()相似,只是在mb_substr()/mb_strcut最后要加入多一个参数,以设定字符串的编码,但是一般的服务器都没打开php_mbstring.dll,需要在php.ini在把php_mbstring.dll打开。

举个例子:

<?php
echo mb_substr('这样一来我的字符串就不会有乱码^_^', 0, 7, 'utf-8');
?>
输出:这样一来我的字
<?php
echo mb_strcut('这样一来我的字符串就不会有乱码^_^', 0, 7, 'utf-8');
?>

输出:这样一

从上面的例子可以看出,mb_substr是按字来切分字符,而mb_strcut是按字节来切分字符,但是都不会产生半个字符的现象。

=============================

PHP实现中文字串截取无乱码的方法

function GBsubstr($string, $start, $length) {
if(strlen($string)>$length){
  $str=null;
  $len=$start+$length;
  for($i=$start;$i<$len;$i++){
  if(ord(substr($string,$i,1))>0xa0){
   $str.=substr($string,$i,2);
   $i++;
  }else{
   $str.=substr($string,$i,1);
  }
  }
  return $str.'...';
}else{
  return $string;
}
}

【实现中文字串截取无乱码的方法--适用于utf-8】

function substr_text($str, $start=0, $length, $charset="utf-8", $suffix="")
{
if(function_exists("mb_substr")){
return mb_substr($str, $start, $length, $charset).$suffix;
}
elseif(function_exists('iconv_substr')){
return iconv_substr($str,$start,$length,$charset).$suffix;
}
$re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
$re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
$re['gbk']  = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
$re['big5']  = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
preg_match_all($re[$charset], $str, $match);
$slice = join("",array_slice($match[0], $start, $length));
return $slice.$suffix;
}

总结

以上所述是小编给大家介绍的PHP中实现中文字串截取无乱码的解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
[转帖]PHP世纪万年历
Dec 06 PHP
海河写的 Discuz论坛帖子调用js的php代码
Aug 23 PHP
php 设计模式之 单例模式
Dec 19 PHP
PHP 程序员的调试技术小结
Nov 15 PHP
PHP使用数组实现队列
Feb 05 PHP
CodeIgniter上传图片成功的全部过程分享
Aug 12 PHP
php url路由入门实例
Apr 23 PHP
php文件上传类完整实例
May 14 PHP
PHP+Ajax实现验证码的实时验证
Jul 20 PHP
php自定义函数转换html标签示例
Sep 29 PHP
CI框架附属类用法分析
Dec 26 PHP
PHP session垃圾回收机制实例分析
Jun 28 PHP
php实现表单提交上传文件功能
May 28 #PHP
PHP封装的非对称加密RSA算法示例
May 28 #PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
May 28 #PHP
Windows下wamp php单元测试工具PHPUnit安装及生成日志文件配置方法
May 28 #PHP
PHP测试框架PHPUnit组织测试操作示例
May 28 #PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
May 28 #PHP
PHP排序二叉树基本功能实现方法示例
May 26 #PHP
You might like
黑夜路人出的几道php笔试题
2009/08/04 PHP
提高PHP编程效率 引入缓存机制提升性能
2010/02/15 PHP
PHP中函数rand和mt_rand的区别比较
2012/12/26 PHP
ThinkPHP中使用ajax接收json数据的方法
2014/12/18 PHP
浅谈PHP eval()函数定义和用法
2016/06/21 PHP
PHP常见字符串处理函数用法示例【转换,转义,截取,比较,查找,反转,切割】
2016/12/24 PHP
js的一些常用方法小结
2011/06/29 Javascript
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
2013/01/15 Javascript
jquery实现的图片点击滚动效果
2014/04/29 Javascript
JS模拟并美化的表单控件完整实例
2015/08/19 Javascript
第二篇Bootstrap起步
2016/06/21 Javascript
jQuery过滤选择器用法示例
2016/09/12 Javascript
jQuery层级选择器实例代码
2017/02/06 Javascript
浅谈JS中的反柯里化( uncurrying)
2017/08/17 Javascript
vue.js在标签属性中插入变量参数的方法
2018/03/06 Javascript
Vue 页面跳转不用router-link的实现代码
2018/04/12 Javascript
vue-router重定向和路由别名的使用讲解
2019/01/19 Javascript
layUI实现列表查询功能
2019/07/27 Javascript
JavaScript编写开发动态时钟
2020/07/29 Javascript
Python中使用urllib2防止302跳转的代码例子
2014/07/07 Python
python基础教程之缩进介绍
2014/08/29 Python
Python语言快速上手学习方法
2018/12/14 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
2019/06/24 Python
浅谈python图片处理Image和skimage的区别
2019/08/04 Python
使用Python将字符串转换为格式化的日期时间字符串
2019/09/01 Python
python中JWT用户认证的实现
2020/05/18 Python
Android Q之气泡弹窗的实现示例
2020/06/23 Python
利用python清除移动硬盘中的临时文件
2020/10/28 Python
HMV日本官网:全球知名的音乐、DVD和电脑游戏零售巨头
2016/08/13 全球购物
财务部岗位职责
2013/11/19 职场文书
酒店前台接待岗位职责
2013/12/03 职场文书
两年的个人工作自我评价
2014/01/10 职场文书
报关报检委托书
2014/04/08 职场文书
老干部工作先进事迹
2014/08/17 职场文书
2014年敬老院工作总结
2014/12/08 职场文书
见习期个人总结
2015/03/05 职场文书