小伙伴们大家好,使用substr()截取中文字符乱码的问题怎么解决呢?

看下面的方法:

方法一:

使用php内置函数mb_substr(); 
    mb_substr( $str, $start, $length, $encoding ) 
            $str,需要截断的字符串 
            $start,截断开始处,起始处为0 
            $length,要截取的字符数 
            $encoding,网页编码,如utf-8,GB2312,GBK ,如果省略,则会使用内部字符编码

 <?php>$str = "我爱学PHP我想成为一名PHPER";echo mb_substr($str,0).'<br>';echo mb_substr($str,2,4).'<br>';echo mb_substr($str,0,4).'<br>';echo mb_substr($str,0,-2).'<br>';echo mb_substr($str,-8).'<br>';echo mb_substr($str,-8,5).'<br>';echo mb_substr($str,-8,-1).'<br>';
<?>

结果如下图:

需要注意的是$length为负数时,如为-1,则表示到尾部数第二个字符

$start为负数时,如为-1,则表示从尾部数第一个字符

疑问:当$encoding为默认或者utf-8的时候,结果是正常的,当为GB2312或者GBK的时候结果会出现乱码的情况,为什么?

答:我的环境默认是UTF-8编码,所以默认的时候也是正常。

方法二:

自定义函数; 通过join()和array_slice()自定义函数;

<?php header('Content-Type:text/html;charset:utf8'); //utf8编码字符串截取无乱码function substr_utf8($str,$start,$length=null){return join("",array_slice(preg_split("//u",$str,-1,PREG_SPLIT_NO_EMPTY),$start,$length));}echo substr_utf8($str,0,10); //输出:我爱学PHP我想成为?>

结果如图:

和使用mb_substr()得到一样的结果

补充:

array_slice() 函数在数组中根据条件取出一段值,并返回。

$a=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow","e"=>"brown");
print_r(array_slice($a,1,2,false));
print_r(array_slice($a,1,2,true));$a=array("red","green","blue","yellow","brown");
print_r(array_slice($a,1,2));
print_r(array_slice($a,1,2,true));

输出的值为:

说明了当数组为关联数组时,preserve为true或false结果都一样会保留键值

数组为索引数组时,preserve为true保留键值,false重置键值

array_slice(array,start,length,preserve)

参数    描述
                array    必需。规定数组。
                start    必需。数值。规定取出元素的开始位置。 0 = 第一个元素。如果该值设置为正数,则从前往后开始取。 如果该值设置为负数,则从后向前取 start 绝对值。 -2 意味着从数组的倒数第二个元素开始。

length    可选。数值。规定被返回数组的长度。如果该值设置为整数,则返回该数量的元素。如果该值设置为负数,则函数将在举例数组末端这么远的地方终止取出。 如果该值未设置,则返回从 start 参数设置的位置开始直到数组末端的所有元素。

preserve    可选。规定函数是保留键名还是重置键名。可能的值:

true - 保留键名
                false - 默认。重置键名

方法三:

mb_strcut();

echo mb_strcut($str,0,3,'utf-8').'<br>';  // 我echo mb_strcut($str,3,5,'utf-8').'<br>';  // 爱

mb_strcut() 和mb_substr()类似,都是从字符串中提取子字符串,但是按字节数来执行,而不是字符个数。 如果截断位置位于多字节字符两个字节的中间,将于该字符的第一个字节开始执行。 这也是和substr()函数的不同之处,后者简单地将字符串在字节之间截断,这将导致一个畸形的字节序列。

注意:

占2个字节的:带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要二个字节编码

占3个字节的:基本等同于GBK,含21000多个汉字

占4个字节的:中日韩超大字符集里面的汉字,有5万多个

一个utf8数字占1个字节

一个utf8英文字母占1个字节

少数是汉字每个占用3个字节,多数占用4个字节。

实现中文字符串截取无乱码的方法相关推荐

  1. PHP实现中文字符串截取无乱码

    在我们学习PHP知识的过程中,PHP截取字符串应该是一个非常常见的字符串基础操作了,想必大家都比较熟悉这方面知识点.但是有些新手朋友们可能遇到过,当截取中英文字符串时出现乱码的情况,其实这个也是非常容 ...

  2. php 中文字符串截取无乱码,php实现中文字符串无乱码截取

    在PHP开发中会经常用到字符串截取,有的时候字符串截取会出现乱码的情况,那么怎么解决这个问题呢,其实也很容易 首先我们要了解关于中英文占多少字节的问题. ASCII码:一个中文汉字占两个字节的空间. ...

  3. php 字符串 中文,php实现中文字符串截取无乱码

    在PHP中经常使用substr来进行字符串的截取,但是当我们用它来实现对中文字符进行截取的时候则会发生乱码问题,比如说:(推荐学习:PHP编程从入门到精通)<?php $mystring=&qu ...

  4. PHP 实现中文截取无乱码的方法

    PHP 实现中文截取无乱码的方法 需知: 中文字符在gbk编码下为2个字符,utf-8下为3个字符 中文字符的ASCII值是从0xa0后开始的 通过ord()函数可以返回字符串中第一个字符的ASCII ...

  5. PHP面试题:实现中文字串截取无乱码的方法

    Mb_substr();

  6. php 中文截断,PHP中实现中文字串截取无乱码的解决方法

    在PHP中,substr()函数截取带有中文字符串的话,可能会出现乱码,这是因为中西文一个字节所占有的字节数不一样,而substr的长度参数是按照字节去算的,在GB2312编码时,一个中文占2个字节, ...

  7. php 字符串 中文,PHP的中文字符串截取

    在PHP中,substr()函数截取带有中文字符串的话,可能会出现乱码,这是因为中西文一个字节所占有的字节数不一样,而substr()的长度参数是按照字节去算的.substr()截取位数不准确,sub ...

  8. php 中英文截取 php,PHP 中英文截取无乱码

    在学习MySql 字符集时,解决了PHP中英文截取无乱码的问题.这个方法的核心在于判断取多少个字节上. //PHP中英文截取无乱码 header('Content_type=text/php;char ...

  9. php截取中文第一个字,php中的一个中文字符串截取函数

    PHP代码: -------------------------------------------------------------------------------- /** ***@Auth ...

最新文章

  1. 年轮蛋糕JOI2014Final
  2. One order time zone
  3. Mysql 多实例multi_mysqld_multi多实例运行
  4. Caffe编译代码的时候报各种未定义未声明
  5. 在电脑搭建oracle服务器端,oracle 服务器端搭建(C#开发环境)
  6. java官网门户源码 SSM框架 自适应-响应式 freemarker 静态模版引擎
  7. 备战软考信息安全工程师经验
  8. 学生网站模板——我的家乡-云南(9页) HTML+CSS+JavaScript 关于我的家乡的HTML网页设计-----云南
  9. 智能称重系统,车牌识别的优势
  10. 2行Python给图片加水印,太强了!
  11. Ctrl、Alt、Shift常用的电脑快捷键大全(收藏级)
  12. 《薛兆丰的经济学课》课程总结2--东西不够
  13. 图论介绍和PyTorch Geometric(PyG)库基础知识
  14. 数据结构——十大排序算法
  15. 肠道-甲状腺轴如何影响健康
  16. linux常用命令:文本编辑
  17. 【UE Unreal Camera】【保姆级教程二】手把手教你通过UE获取摄像头帧数据
  18. linux之pmap命令查看进程的地址空间和占用的内存
  19. HTT超线程技术,CPU,core,package,die的概念
  20. 进军高级测试这几条建议,让你在自动化界占据一个角落......

热门文章

  1. 2020年,你应该知道 23 个非常实用的 NodeJs 库
  2. Linux 实用命令汇总
  3. android源码环境下编译fourthling.cling库的依赖问题
  4. Photoshop如何制作图片渐变效果
  5. 这4点微不足道的改变,正在带我起飞
  6. 【更新v1.1】matlab/simulink代码生成与labview调用(DLL方式)
  7. java计算:拉马努金数
  8. 高通WiFi方案OLPC方法说明
  9. 数据库的概念结构设计与计算机的,数据库结构的优化设计研究
  10. Live2D看板娘详细实现