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 相关文章推荐
一个多文件上传的例子(原创)
Oct 09 PHP
php面向对象全攻略 (五) 封装性
Sep 30 PHP
在IIS7.0下面配置PHP 5.3.2运行环境的方法
Apr 13 PHP
PHP 查找字符串常用函数介绍
Jun 07 PHP
php+ajax制作无刷新留言板
Oct 27 PHP
php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
Nov 30 PHP
常用PHP数组排序函数归纳
Aug 08 PHP
PHP 表单提交及处理表单数据详解及实例
Dec 27 PHP
mac os快速切换多个PHP版本的方法
Mar 07 PHP
实例解析php的数据类型
Oct 24 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
May 06 PHP
php的无刷新操作实现方法分析
Feb 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代码
2006/12/06 PHP
php通过COM类调用组件的实现代码
2012/01/11 PHP
微信公众号判断用户是否已关注php代码解析
2016/06/24 PHP
PHP+MYSQL实现读写分离简单实战
2017/03/13 PHP
jQuery 表格插件整理
2010/04/27 Javascript
使用jQuery jqPlot插件绘制柱状图
2014/12/18 Javascript
javascript实现textarea中tab键的缩排处理方法
2015/06/26 Javascript
JavaScript框架是什么?怎样才能叫做框架?
2015/07/01 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
2017/02/20 Javascript
完美解决手机浏览器顶部下拉出现网页源或刷新的问题
2017/11/30 Javascript
解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题
2020/08/14 Javascript
Python下rrdtool模块的基本使用方法
2015/11/13 Python
python常用函数详解
2016/09/13 Python
Python多维/嵌套字典数据无限遍历的实现
2016/11/04 Python
python使用Tkinter实现在线音乐播放器
2018/01/30 Python
python批量替换多文件字符串问题详解
2018/04/22 Python
python删除本地夹里重复文件的方法
2020/11/19 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
2018/07/13 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
2019/04/25 Python
使用Python画股票的K线图的方法步骤
2019/06/28 Python
Python面向对象之私有属性和私有方法应用案例分析
2019/12/31 Python
Python 实现平台类游戏添加跳跃功能
2020/03/27 Python
Python中格式化字符串的四种实现
2020/05/26 Python
基于python实现ROC曲线绘制广场解析
2020/06/28 Python
django rest framework 过滤时间操作
2020/07/12 Python
纯CSS3实现圆角效果(含IE兼容解决方法)
2014/05/07 HTML / CSS
欧洲最大的笔和书写专家:The Pen Shop
2017/03/19 全球购物
美赞臣新加坡官方旗舰店:Enfagrow新加坡
2019/05/15 全球购物
Linux中如何用命令创建目录
2015/01/12 面试题
实习单位推荐信范文
2013/11/27 职场文书
初一家长会邀请函
2014/01/31 职场文书
煤矿安全承诺书
2014/05/22 职场文书
2014年初中班主任工作总结
2014/11/08 职场文书
2014年圣诞节寄语
2014/12/08 职场文书
安全教育的主题班会
2015/08/13 职场文书
为什么mysql字段要使用NOT NULL
2021/05/13 MySQL