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制作静态网站的模板框架(二)
Oct 09 PHP
php SQL之where语句生成器
Mar 24 PHP
PHP中将字符串转化为整数(int) intval() printf() 性能测试
Mar 20 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
May 23 PHP
php获取数组长度的方法(有实例)
Oct 27 PHP
在html文件中也可以执行php语句的方法
Apr 09 PHP
深入浅析PHP无限极分类的案例教程
May 09 PHP
PHP 返回13位时间戳的实现代码
May 13 PHP
ThinkPHP和UCenter接口冲突的解决方法
Jul 25 PHP
php事件驱动化设计详解
Nov 10 PHP
yii2中dropDownList实现二级和三级联动写法
Apr 26 PHP
Yii2框架中一些折磨人的坑
Dec 15 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
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
2009/06/08 PHP
wamp下修改mysql访问密码的解决方法
2013/05/07 PHP
使用PHP求两个文件的相对路径
2013/06/20 PHP
功能强大的php分页函数
2016/07/20 PHP
PHP那些琐碎的知识点(整理)
2017/05/20 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
js bind 函数 使用闭包保存执行上下文
2011/12/26 Javascript
Javascript:为input设置readOnly属性(示例讲解)
2013/12/25 Javascript
JavaScript动态改变HTML页面元素例如添加或删除
2014/08/10 Javascript
jQuery使用模式窗口实现在主页面和子页面中互相传值的方法
2016/03/01 Javascript
node.js连接MongoDB数据库的2种方法教程
2017/05/17 Javascript
详解在AngularJS的controller外部直接获取$scope
2017/06/02 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
2017/10/20 Javascript
javascript中call,apply,bind的区别详解
2020/12/11 Javascript
Vue实现摇一摇功能(兼容ios13.3以上)
2021/01/26 Vue.js
使用django-crontab实现定时任务的示例
2018/02/26 Python
pycharm下查看python的变量类型和变量内容的方法
2018/06/26 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
2018/10/29 Python
Python设计模式之建造者模式实例详解
2019/01/17 Python
Python使用reportlab模块生成PDF格式的文档
2019/03/11 Python
Python学习笔记之文件的读写操作实例分析
2019/08/07 Python
详解在Python中以绝对路径或者相对路径导入文件的方法
2019/08/30 Python
Pandas实现一列数据分隔为两列
2020/05/18 Python
Python turtle库的画笔控制说明
2020/06/28 Python
浅析HTML5中header标签的用法
2016/06/24 HTML / CSS
HTML5 图片悬停放大的实现代码示例
2019/12/04 HTML / CSS
HTML5逐步分析实现拖放功能的方法
2020/09/30 HTML / CSS
Html5基于canvas实现电子签名并生成PDF文档
2020/12/07 HTML / CSS
意大利顶级奢侈品电商:LUISAVIAROMA(支持中文)
2020/05/26 全球购物
金蝶的一道SQL笔试题
2012/12/18 面试题
应届优秀本科大学毕业生自我鉴定
2014/01/21 职场文书
西双版纳导游词
2015/02/03 职场文书
工作试用期自我评价
2015/03/10 职场文书
运动会广播稿50字
2015/08/19 职场文书
职工趣味运动会开幕词
2016/03/04 职场文书
基于Pygame实现简单的贪吃蛇游戏
2021/12/06 Python