PHP中使用substr截取字符串出现中文乱码问题该怎么办

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP中使用substr截取字符串出现中文乱码问题该怎么办相关的知识,希望对你有一定的参考价值。

给你一个我自己写的字符串截取类,不会出现乱码。

function displaystr($str, $start, $lenth)
$len = strlen($str);
$r = array();
$n = 0;
$m = 0;
for($i = 0; $i < $len; $i++)
$x = substr($str, $i, 1);
$a = base_convert(ord($x), 10, 2);
$a = substr('00000000'.$a, -8);
if ($n < $start)
if (substr($a, 0, 1) == 0)
elseif (substr($a, 0, 3) == 110)
$i += 1;
elseif (substr($a, 0, 4) == 1110)
$i += 2;

$n++;
else
if (substr($a, 0, 1) == 0)
$r[ ] = substr($str, $i, 1);
elseif (substr($a, 0, 3) == 110)
$r[ ] = substr($str, $i, 2);
$i += 1;
elseif (substr($a, 0, 4) == 1110)
$r[ ] = substr($str, $i, 3);
$i += 2;
else
$r[ ] = '';

if (++$m >= $lenth)
break;



return join('',$r);

echo $str="你在找php截取字符串的函数吗?测试一下吧,且听风吟福利吧的地址是3tii.com,你试试看会不会出现乱码!不区分大小写,不区分数字字母中文";
echo '';
echo displaystr($str,3,8);
参考技术A 涉及包含中文的字符串处理,需要使用多字节字符串(mbstring)处理函数,先要在php.ini里打开mbstring扩展。
截取字符串就用mb_substr函数,使用时注意 一定需要指定编码。例如
echo mb_substr("欢迎加入印特学院",4,4,"UTF-8");

希望能够帮助到你,有问题随时交流。
参考技术B 可以用mb_substr来进行截取 参考技术C substr是按字节截取的 中文用mb_substr。。。。。。。

PHP实现中文截取无乱码

     字符串的处理是编程中比较常见的,各种编程语言对字符串的处理也提供了大量函数,像php中mb_substr()函数可以实现对中文字符串的截取,如何使用自定义方法实现中文字符串截取无乱码这也是面试经常遇到的一道题目,不要觉得这是多此一举,php内置函数已经实现了,为什么要自己实现.其实这道题的真实目的是考查你对字符编码的理解.最起码你要知道从哪里开始截取,截取几个字节才是一个完整的字符,不然截取到的都是乱码.这就需要你对多字节字符编码有一定的了解.下面一起来实现吧.

 1 <?php
 2 /**
 3  * 中文截取无乱码
 4  * 下面自定义一个函数实现中文截取无乱码,由于中文字符是多字节编码实现的,所以
 5  * 在截取的时候不仅要知道从哪里开始截取还要知道截取几个字节,在这一点上utf-8
 6  * 实现的比较好,这种编码可以通过最高位字节来区分该字符占几个字节的编码
 7  * 
 8  * UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,由Ken Thompson于1992年创建。
 9  * 
10  * 通过查询相关资料可知:
11  * utf-8最高位字节与该字符所占字节数有以下对应关系
12  * 0xxx xxxx        占1字节
13  * 110x xxxx        占2字节
14  * 1110 xxxx        占3字节
15  * 一般三个字节能够表示所有汉字对应编码
16  */
17 /**
18  * @param  str   $str    被截取的字符串
19  * @param  int   $length 需要截取长度,即需要截取的字符个数
20  */
21 function mulsubstr($str,$length){
22     if($length<=0){    //截取字符为0或负数,返回空字符串
23         return ‘‘;
24     }
25     $offset=0;  //截取每个字符时最高位字节的偏移量(位置),开始的时候截取第一个字符,该字符最高位字节位置为0
26     $chars=0;  //已经截取到的字符,开始时为0
27     $returnstr=‘‘;  //截取后返回的字符串  
28     while($chars<$length){  //只要已经截取到的字符没有达到需要截取的就继续截取
29         $highchar=  decbin(ord(substr($str, $offset,1))); //得到每个字符最高位字节编码字符,根据该编码字符判断向后截取几个字节
30         if(strlen($highchar)<8){ //该字符占一个字节时,按照上面的规律,返回字符编码二进制为0xxx xxxx的字符串形式,转为二进制时开头的0会舍弃,该字节就只有7位了,
31    //若此处使用if(substr($highchar,0,2)==‘01‘),则该判断永远不会生效,因为在decbin时最高位字节为0会舍去,这样就可以使用最高位字节长度来判断了,这点需要重点理解。
32             $cutbyte=1;//
33         }else if(substr($highchar,0,3)== ‘110‘){
34             $cutbyte=2;
35         }else if(substr($highchar, 0,4)== ‘1110‘){
36             $cutbyte=3;
37         }else if(substr($highchar,0,5)==‘11110‘){
38             $cutbyte=4;
39         }
40         //判断完对应字符编码所占字节后开始截取并拼接
41         $returnstr.=substr($str,$offset,$cutbyte);
42         $chars+=1;  //继续截取下一个字符
43         $offset+=$cutbyte;  //下一个字符最高字节偏移量
44     }
45     return $returnstr;  //返回需要截取的字符串 
46 }
47 $STR=‘中华人民共和国hubei省武汉市‘;
48 echo mulsubstr($STR, 13);  //中华人民共和国hubei省

 

以上是关于PHP中使用substr截取字符串出现中文乱码问题该怎么办的主要内容,如果未能解决你的问题,请参考以下文章

php截取中文字符串乱码问题

php截取中文字符串无乱码的方法

php解决中文截取乱码问题

PHP实现中文截取无乱码

php截取utf-8中文字符串乱码的解决方法

autolisp用substr截取汉字?