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 相关文章推荐
如何给phpadmin一个保护
Oct 09 PHP
PHP文件读写操作之文件写入代码
Jan 13 PHP
PHP_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
May 04 PHP
PHP登录环节防止sql注入的方法浅析
Jun 30 PHP
CodeIgniter框架URL路由总结
Sep 03 PHP
PHP strtotime函数用法、实现原理和源码分析
Feb 04 PHP
PHP通过API获取手机号码归属地
May 28 PHP
php中smarty区域循环的方法
Jun 11 PHP
PHP使用MPDF类生成PDF的方法
Dec 08 PHP
PHP用FTP类上传文件视频等的简单实现方法
Sep 23 PHP
php使用str_shuffle()函数生成随机字符串的方法分析
Feb 17 PHP
详解php中serialize()和unserialize()函数
Jul 08 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
在IIS上安装PHP4.0正式版
2006/10/09 PHP
php 高性能书写
2010/12/11 PHP
PHP中鲜为人知的10个函数
2014/02/28 PHP
php中mkdir函数用法实例分析
2014/11/15 PHP
简单谈谈favicon
2015/06/10 PHP
js图片延迟技术一般的思路与示例
2014/03/20 Javascript
jQuery实现HTML5 placeholder效果实例
2014/12/09 Javascript
jQuery处理json数据返回数组和输出的方法
2015/03/11 Javascript
Node.js中的process.nextTick使用实例
2015/06/25 Javascript
jQuery实现Tab选项卡切换效果简单演示
2015/11/23 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
2016/04/19 Javascript
JavaScript中匿名函数的用法及优缺点详解
2016/06/01 Javascript
图解prototype、proto和constructor的三角关系
2016/07/31 Javascript
3种不同的ContextMenu右键菜单实现代码
2016/11/03 Javascript
vue调用高德地图实例代码
2017/04/28 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
2017/08/07 Javascript
详解Ant Design of React的安装和使用方法
2018/12/27 Javascript
在Vue mounted方法中使用data变量详解
2019/11/05 Javascript
JavaScript React如何修改默认端口号方法详解
2020/07/28 Javascript
[48:26]VGJ.S vs infamous Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
在Python下使用Txt2Html实现网页过滤代理的教程
2015/04/11 Python
在Python中使用matplotlib模块绘制数据图的示例
2015/05/04 Python
日常整理python执行系统命令的常见方法(全)
2015/10/22 Python
python 通过logging写入日志到文件和控制台的实例
2018/04/28 Python
python读写LMDB文件的方法
2018/07/02 Python
简单了解python协程的相关知识
2019/08/31 Python
40个你可能不知道的Python技巧附代码
2020/01/29 Python
TensorFlow MNIST手写数据集的实现方法
2020/02/05 Python
Python实现转换图片背景颜色代码
2020/04/30 Python
浅谈HTML5新增及移除的元素
2016/06/27 HTML / CSS
美工的岗位职责
2013/11/14 职场文书
专科毕业生自我鉴定
2013/12/01 职场文书
施工工地安全标语
2014/06/07 职场文书
领导干部“四风”问题批评与自我批评材料
2014/09/24 职场文书
大学生自荐信怎么写
2015/03/26 职场文书
基于Redis位图实现用户签到功能
2021/05/08 Redis