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安装为Apache DSO
Oct 09 PHP
PHP 缓存实现代码及详细注释
May 16 PHP
php xml 入门学习资料
Jan 01 PHP
php获取post中的json数据的实现方法
Jun 08 PHP
解析PHP的session过期设置
Jun 29 PHP
php使用timthumb生成缩略图的方法
Jan 22 PHP
Zend Framework教程之MVC框架的Controller用法分析
Mar 07 PHP
深入解析PHP的Yii框架中的缓存功能
Mar 29 PHP
PHP Oauth授权和本地加密实现方法
Aug 12 PHP
详解PHP原生DOM对象操作XML的方法
Oct 17 PHP
浅析PHP类的反射来实现依赖注入过程
Feb 06 PHP
PHP-FPM的配置与优化讲解
Mar 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
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
2009/10/29 PHP
php错误、异常处理机制(补充)
2012/05/07 PHP
symfony2.4的twig中date用法分析
2016/03/18 PHP
php中引用&amp;的用法分析【变量引用,函数引用,对象引用】
2016/12/12 PHP
PHP判断一个数组是另一个数组子集的方法详解
2017/07/31 PHP
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
javascript textContent与innerText的异同分析
2010/10/22 Javascript
JS文本框追加多个下拉框的值的简单实例
2013/07/12 Javascript
jQuery+jsp下拉框联动获取本地数据的方法(附源码)
2015/12/03 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
2017/02/19 Javascript
Nodejs 和Session 原理及实战技巧小结
2017/08/25 NodeJs
angularjs利用directive实现移动端自定义软键盘的示例
2017/09/20 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
JQ图片文件上传之前预览功能的简单实例(分享)
2017/11/12 Javascript
JavaScript实现AOP详解(面向切面编程,装饰者模式)
2017/12/19 Javascript
vue-cli结合Element-ui基于cropper.js封装vue实现图片裁剪组件功能
2018/03/01 Javascript
jQuery实现input[type=file]多图预览上传删除等功能
2019/08/02 jQuery
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
[03:55]TI9战队采访——TNC Predator
2019/08/22 DOTA
[43:03]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python将xml xsl文件生成html文件存储示例讲解
2013/12/03 Python
Python实现多线程HTTP下载器示例
2017/02/11 Python
Python实现感知机(PLA)算法
2017/12/20 Python
使用python实现链表操作
2018/01/26 Python
Python语言的变量认识及操作方法
2018/02/11 Python
python爬虫获取新浪新闻教学
2018/12/23 Python
Python整数对象实现原理详解
2019/07/01 Python
python for和else语句趣谈
2019/07/02 Python
python使用pandas处理excel文件转为csv文件的方法示例
2019/07/18 Python
python爬虫模拟浏览器的两种方法实例分析
2019/12/09 Python
python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例
2020/03/08 Python
解决Python安装cryptography报错问题
2020/09/03 Python
专门经营化妆刷的美国彩妆品牌:Sigma Beauty
2017/09/11 全球购物
Pottery Barn阿联酋:购买家具、家居装饰及更多
2019/12/08 全球购物
abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?
2012/10/15 面试题
PyQt5结合QtDesigner实现文本框读写操作
2021/06/11 Python