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作为Shell脚本语言使用
Oct 09 PHP
弄了个检测传输的参数是否为数字的Function
Dec 06 PHP
php 结果集的分页实现代码
Mar 10 PHP
IIS下PHP连接数据库提示mysql undefined function mysql_connect()
Jun 04 PHP
PHP学习散记_编码(json_encode 中文不显示)
Nov 10 PHP
深入解析PHP内存管理之谁动了我的内存
Jun 20 PHP
php curl模拟post请求小实例
Nov 13 PHP
PHP中把对象数组转换成普通数组的方法
Jul 10 PHP
PHP信号量基本用法实例详解
Feb 12 PHP
WordPress中设置Post Type自定义文章类型的实例教程
May 10 PHP
PHP简单日历实现方法
Jul 20 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
Sep 30 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 socke 向指定页面提交数据
2008/07/23 PHP
php遍历文件夹所有文件子文件夹函数代码
2013/11/27 PHP
PHP实现补齐关闭的HTML标签
2016/03/22 PHP
PHP入门教程之数学运算技巧总结
2016/09/11 PHP
Yii2框架自定义验证规则操作示例
2019/02/08 PHP
浅谈laravel orm 中的一对多关系 hasMany
2019/10/21 PHP
JavaScript中的类数组对象介绍
2014/12/30 Javascript
JS+CSS实现仿新浪微博搜索框的方法
2015/02/24 Javascript
使用AngularJS 应用访问 Android 手机的图片库
2015/03/24 Javascript
Js数组排序函数sort()介绍
2015/06/08 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
2015/12/17 Javascript
JavaScript中Object.prototype.toString方法的原理
2016/02/24 Javascript
JS从一组数据中找到指定的单条数据的方法
2016/06/02 Javascript
JavaScript的事件机制详解
2017/01/17 Javascript
微信小程序使用checkbox显示多项选择框功能【附源码下载】
2017/12/11 Javascript
微信小程序实现顶部下拉菜单栏
2018/11/04 Javascript
nuxt 路由、过渡特效、中间件的实现代码
2020/11/06 Javascript
[01:05:29]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第二场 1月24日
2021/03/11 DOTA
[01:03:50]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第二场 2月7日
2021/03/11 DOTA
python dict 字典 以及 赋值 引用的一些实例(详解)
2017/01/20 Python
在cmd中运行.py文件: python的操作步骤
2018/05/12 Python
Python+selenium 获取一组元素属性值的实例
2018/06/22 Python
Python Flask前后端Ajax交互的方法示例
2018/07/31 Python
深入浅析Python中的迭代器
2019/06/04 Python
Python3 shelve对象持久存储原理详解
2020/03/23 Python
Python 如何对文件目录操作
2020/07/10 Python
在pycharm创建scrapy项目的实现步骤
2020/12/01 Python
python中pivot()函数基础知识点
2021/01/03 Python
德国婴儿推车和儿童安全座椅商店:BABYSHOP
2016/09/01 全球购物
新西兰最大的品牌运动鞋购物网站:Platypus NZ
2017/10/27 全球购物
澳大利亚最大的百货公司:Myer
2018/12/21 全球购物
在子网210.27.48.21/30种有多少个可用地址?分别是什么?
2014/07/27 面试题
传统软件工程与面向对象的软件工程有什么区别
2012/05/31 面试题
Java中采用什么结构来捕获、处理异常?各子句的顺序、功能如何
2013/10/07 面试题
打架检讨书100字
2014/01/19 职场文书
分享3个非常实用的 Python 模块
2022/03/03 Python