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省
时间: 2024-08-04 10:11:55

PHP实现中文截取无乱码的相关文章

中文截取无乱码

/* *中文截取无乱码 */ function showsubstr_chinese($str, $start, $length = null) { return join("", array_slice( preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY), $start, $length)); }

php中文截取无乱码

<?php header('Content-Type:text/html;charset=utf-8'); function cutstr($str,$len){     if($len<0){return null;}     $chars = 0; //字符数量     $offset = 0;     $res = '';         while($chars < $len){             $high = decbin(ord(substr($str,$offset

PHP中实现中文字串截取无乱码的方法

在PHP中,substr()函数截取带有中文字符串的话,可能会出现乱码,这是因为中西文一个字节所占有的字节数不一样,而substr的长度参数是按照字节去算的,在GB2312编码时,一个中文占2个字节,英文为1个字节,而在UTF-8编码当中,一个中文可能占有2个或3个字节,英文或半角标点占1字节. 直接使用PHP函数substr截取中文字符可能会出现乱码,主要是substr可能硬生生的将一个中文字符“锯”成两半.解决办法: 1.使用mbstring扩展库的mb_substr截取就不会出现乱码了.

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

利用php内置方法mb_substr截取中文不乱码,使用起来非常简单 <?php $str = '我喜欢laravel or yii2'; echo mb_substr($str, 0, 1, 'utf8'); //输出 我 exit; mb_substr方法比substr多一个参数,用来指定字符串编码.utf-8编码截取示例 $str = '我like laravel or yii2'; echo mb_substr($str, 0, 2, 'utf8'); //输出 我I 中英混合也完全没有

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

首页要知道的:1.中文字符在gbk编码下占2个字节,在utf-8编码下占3个字节 2.ord() 函数返回字符串第一个字符的 ASCII 值 3.中文字符的ASCII值是大于0xa0. 关键的点是判断要截取的字符串是中文字符还是英文字符,用ord(substr($str,$start,1))>0xa0可判断,大于则是中文,否则是英文.实现代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

PHP实现中文字串截取无乱码的方法

直接使用PHP函数substr截取中文字符可能会出现乱码,主要是substr可能硬生生的将一个中文字符“锯”成两半.解决办法: 1.使用mbstring扩展库的mb_substr截取就不会出现乱码了. 2.自己书写截取函数,但效率不如用mbstring扩展库来得高. 3.如果仅是为了输出截取的串,可用如下方式实现:substr($str, 0, 30).chr(0). ============================= substr()函数可以分割文字,但要分割的文字如果包括中文字符往往

【技术宅1】实现中文字串截取无乱码的方法

function substr_text($str, $start=0, $length, $charset="utf-8", $suffix=""){ if(function_exists("mb_substr")){//mb_substr函数不是php内置函数,需要加载php.mbstring.dll才能使用,否则报错 return mb_substr($str, $start, $length, $charset).$suffix; }el

PHP中文无乱码截取

正在上传文件反正无聊 就把php无乱码截取写出来吧` 参数说明 gbk    字符编码中,存储中文字符要2个字节 uft-8  字符编码中,存储中文字符要3个字节 0xa0  半个汉字 ord()— 返回字符的 ASCII 码值 chr() — 返回指定的字符 在网上我也看到一些截取中文的函数 但是我认为他们是有缺陷的 如不能区别utf-8  gbk的字符集 中文 于是我自己写了一个 但是我却发现我写的函数其实是用mb系列函数 ,我也是廋少不了 header("content-type:text

php截取中文无乱码

在PHP中需要对字符串进行截取,如果没有装mb扩展(mb_substr函数),对中文截取就需要进行相应的处理.下面是对字符串 "世s界s的功s\\\夫萨的mn是非得失sdf dsf dsf 达" 截取10个字符,最后的输出是"世s界s的",编码均为utf8: <?php$ss = '世s界s的功s\\\夫萨的mn是非得失sdf dsf dsf 达';$aa = CHsubstr($ss, 0, 10);echo($aa); function CHsubstr(