A-A+
php截取utf8字符串和gbk字符串函数
在 PHP 中,我们直接使用PHP strlen函数进行字符串截取,对于英文字符,没有什么区别,输出的结果都是一样的,而在截取中文时,却有一点小小的问题,我们知道,字符分为两种状态,一种是 gbk 字符串,另一种就是 utf-8 字符串,如果按照常规的输出方法,输出的结果是不一样的。
php strlen 函数最基本的参数有 str 字符串,len 长度,start 开始位置,如果截取的字符串 gbk 格式,那么 len 的步长为 1,截取“夏日博客”,只取前两个字符,输出就是“夏日”,而截取的字符串类型是 utf-8 格式的话,那么 len的步长则为 2,输出的结果为“夏日博”,这也就是两种格式输出不一样的原因。
简要说明一下截出输入的步长,以“夏日博客”为例,步长从 0 开始,从开始的“夏”之前开始算起,第一步为0,则“夏”之后为第二步为 1,依此类推。
依照上述原理,我们可以写一个同时支持截取 gbk 和 utf-8 字符的函数,如下:
<?php if(!function_exists('cn_substr')){ function cn_substr($string='',$length=0,$start=0,$lang='gbk'){ switch($lang){ case 'gbk':$step = 1;break; case 'utf-8';$step = 2;break; default:$step = 2;break; } $result = ''; $stringlength = strlen($string); $length = intval($length); $start = intval($start); if($length==0||$stringlength<$start+1){ return ''; } $index = 0; for($i=0;$i<$stringlength;$i++){ $char = ''; if($length){ if(ord($string[$i])>0x80){ for($j=$i;$j<=$i+$step;$j++){ $char .= $string[$j]; } $i+=$step; }else{ $char = $string[$i]; } $index++; if($index>=$start){ $length--; $result .= $char; } }else{ break; } } return $result; } } echo cn_substr("败鸟先飞",2,0,"utf-8"); //使用方法 ?>