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 对输入信息的进行安全过滤的函数代码
Jun 29 PHP
PHP的构造方法,析构方法和this关键字详细介绍
Oct 22 PHP
利用php下载xls文件(自己动手写的)
Apr 18 PHP
PHP使用Session遇到的一个Permission denied Notice解决办法
Jul 30 PHP
Yii 快速,安全,专业的PHP框架
Sep 03 PHP
php简单实现多字节字符串翻转的方法
Mar 31 PHP
Yii2中关联查询简单用法示例
Aug 10 PHP
phpmailer绑定邮箱的实现方法
Dec 01 PHP
php常用正则函数实例小结
Dec 29 PHP
php利用ZipArchive类操作文件的实例
Jan 21 PHP
tp5.1 框架路由操作-URL生成实例分析
May 26 PHP
laravel数据库查询结果自动转数组修改实例
Feb 27 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
php5.3 废弃函数小结
2010/05/16 PHP
PHP转换IP地址到真实地址的方法详解
2013/06/09 PHP
关于php开启错误提示的总结
2019/09/24 PHP
laravel-admin 中列表筛选方法
2019/10/03 PHP
JavaScript 语法集锦 脚本之家基础推荐
2009/11/15 Javascript
script标签属性type与language使用选择
2012/12/02 Javascript
js里怎么取select标签里的值并修改
2012/12/10 Javascript
javascript当中的代码嗅探扩展原生对象和原型(prototype)
2013/01/11 Javascript
用JQuery 判断某个属性是否存在hasAttr的解决方法
2013/04/26 Javascript
Jquery+asp.net后台数据传到前台js进行解析的方法
2014/05/11 Javascript
JavaScript的jQuery库插件的简要开发指南
2015/08/12 Javascript
浅析jQuery操作select控件的取值和设值
2016/12/07 Javascript
Node 自动化部署的方法
2017/10/17 Javascript
JavaScript基础心法 数据类型
2018/03/05 Javascript
Vue2.0结合webuploader实现文件分片上传功能
2018/03/09 Javascript
原生js实现html手机端城市列表索引选择城市
2020/06/24 Javascript
[13:39]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第一场
2014/05/26 DOTA
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
2018/02/21 Python
python smtplib模块自动收发邮件功能(一)
2018/05/22 Python
Python实现Wordcloud生成词云图的示例
2020/03/30 Python
django 利用Q对象与F对象进行查询的实现
2020/05/15 Python
Python识别处理照片中的条形码
2020/11/16 Python
python3 re返回形式总结
2020/11/20 Python
10分钟理解CSS3 FlexBox弹性布局
2018/12/20 HTML / CSS
5 个强大的HTML5 API 函数推荐
2014/11/19 HTML / CSS
日本网路线上商品代购服务:转送JAPAN
2016/08/05 全球购物
彪马英国官网:PUMA英国
2019/02/11 全球购物
在加拿大在线租赁和购买电子游戏:Game Access
2019/09/02 全球购物
EJB的基本架构
2016/09/22 面试题
高中政治教学反思
2014/01/18 职场文书
企业申诉管理制度
2014/01/30 职场文书
家长对孩子的评语
2014/04/18 职场文书
2014年环境整治工作总结
2014/12/10 职场文书
2019感恩宣传标语!
2019/07/05 职场文书
用Python写一个简易版弹球游戏
2021/04/13 Python
一篇文章带你学习Mybatis-Plus(新手入门)
2021/08/02 Java/Android