A-A+

php截取utf8字符串和gbk字符串函数

2012年06月09日 PHP技术文章 暂无评论 阅读 281 views 次

在 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&#91;$i&#93;)>0x80){   
                    for($j=$i;$j<=$i+$step;$j++){   
                        $char .= $string&#91;$j&#93;;   
                    }   
                    $i+=$step;   
                }else{   
                    $char = $string&#91;$i&#93;;   
                }   
                $index++;   
                if($index>=$start){   
                    $length--;   
                    $result .= $char;   
                }   
            }else{   
                break;   
            }   
        }   
        return $result;   
    }   
}   
echo cn_substr("败鸟先飞",2,0,"utf-8");  //使用方法   
?>
标签:

给我留言