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 url地址栏传中文乱码解决方法集合
Jun 25 PHP
PHP中文件上传的一个问题
Sep 04 PHP
理解php原理的opcodes(操作码)
Oct 26 PHP
php的数组与字符串的转换函数整理汇总
Jul 18 PHP
php float不四舍五入截取浮点型字符串方法总结
Oct 28 PHP
PHP和javascript常用正则表达式及用法实例
Jul 01 PHP
php实现微信公众平台账号自定义菜单类
Dec 02 PHP
php给每个段落添加空格的方法
Mar 20 PHP
PHP mysql事务问题实例分析
Jan 18 PHP
PHP实现电商订单自动确认收货redis队列
May 17 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
Jul 03 PHP
PHP实现文件上传操作和封装
Mar 04 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
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
2006/07/09 PHP
超小PHP小马小结(方便查找后门的朋友)
2012/05/05 PHP
php记录代码执行时间(实现代码)
2013/07/05 PHP
php上传图片并压缩的实现方法
2015/12/22 PHP
php获取POST数据的三种方法实例详解
2016/12/20 PHP
Thinkphp 框架扩展之驱动扩展实例分析
2020/04/27 PHP
jquery ui dialog ie8出现滚动条的解决方法
2010/12/06 Javascript
JQuery 实现在同一页面锚点链接之间的平滑滚动
2014/10/29 Javascript
jquery实现页面关键词高亮显示的方法
2015/03/12 Javascript
微信小程序 less文件编译成wxss文件实现办法
2016/12/05 Javascript
用纯Node.JS弹出Windows系统消息提示框实例(MessageBox)
2017/05/17 Javascript
ionic2屏幕适配实现适配手机、平板等设备的示例代码
2017/08/11 Javascript
vue-infinite-loading2.0 中文文档详解
2018/04/08 Javascript
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
JS apply用法总结和使用场景实例分析
2020/03/14 Javascript
解决js中的setInterval清空定时器不管用问题
2020/11/17 Javascript
Vue实现摇一摇功能(兼容ios13.3以上)
2021/01/26 Vue.js
Python进阶_关于命名空间与作用域(详解)
2017/05/29 Python
实用自动化运维Python脚本分享
2018/06/04 Python
Python OpenCV之图片缩放的实现(cv2.resize)
2019/06/28 Python
Python进阶:生成器 懒人版本的迭代器详解
2019/06/29 Python
纯CSS3实现的8种Loading动画效果
2014/07/05 HTML / CSS
美国在线乐器和设备商店:Musician’s Friend
2018/07/06 全球购物
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
英语专业学生个人求职信
2014/01/28 职场文书
迟到早退检讨书
2014/02/10 职场文书
挖掘机司机岗位职责
2014/02/12 职场文书
财务会计大学生自我评价
2014/04/09 职场文书
三月法制宣传月活动总结
2014/07/03 职场文书
高中学校对照检查材料
2014/08/31 职场文书
观看信仰心得体会
2014/09/04 职场文书
副校长个人对照检查材料思想汇报
2014/10/04 职场文书
车间主任岗位职责
2015/02/03 职场文书
2015小学毕业班工作总结
2015/07/21 职场文书
分享:关于学习的励志名言赏析
2019/08/16 职场文书
Go缓冲channel和非缓冲channel的区别说明
2021/04/25 Golang