天天看点

PHP截取中文字符串乱码问题(UTF8编码下)

    前几天,去面试中遇到一个帮毕业就遇到的问题,PHP截取中文字符串乱码问题。究其根本php的字符串截取函数是根据字节来的,而汉字的编码一需要的不单单一个字节,那么自然就会出现乱码问题。

    现在常用的编码格式是UTF8,GBK,GBK2312,BIG5。GBK是GBK2312的升级。现在我开发中遇到的基本都是UTF8,GBK常用在论坛BBS上。今天自己写了下UTF8的,测试下还说的过去,毕竟从网上拷下来的是可以用,但是如果有时间最好还是自己写一下,这样只有到自己手里的才是自己的。

    今天写了UTF8的中文字符截取,不单单是截取从零开始,可以指定位置开始,当然如果是中文那么会中文下一个字符开始,结束是从指定的位置或者指定的汉字结束位置。

函数代码:

function subUTF8str($str,$start=0,$length=80){ 

    $str_length = strlen($str);//传入字符串的字节长度 

    $end_length = $start + $length; //8 //预计结束字节 

    $cut_length = 0; //截取的字节长度 

    $cut_end = $cut_begin = false; //初始化截取状态 

    if($start >= $str_length){ //如果字符串开始位置大于字符串总长度 那么返回空 

        return null; 

    } 

    if( ($start == 0) && ($length >= $str_length) ){ //如果起始位置是0 截取长度大于等于总长度 直接返回 

        return $str; 

    for($i=0; $i <= $str_length; $i++){ 

        if( ($start <= $i) && ($cut_begin === false) ){//如果这一个判断在第二个if后面则取下一个汉字为开头 

            $cut_begin = $i; 

        } 

        if (ord($str[$i]) > 127){ //如果当前字符的ASCII 值大于127 则是认为是汉字 

            $i += 2; //UTF-8汉字是24位三个字节 如果是汉字那么增加两位 

            $cut_begin?$cut_length += 3:null; 

        }else{ 

            $cut_begin?$cut_length += 1:null; 

        if( ($end_length <= $i) && ($cut_end === false) ){ 

            break; 

    return substr($str, $cut_begin , $cut_length ); 

整体测试代码

header("Content-type:text/html;charset=UTF-8"); 

set_time_limit(0); 

$str = ''; 

for($i=0;$i<1000;$i++){ 

    $str .='这里是截cefaACC截$%^&*截()_((截^&*^截*&%截%'; 

echo time().'<br/>'; 

    $begin = rand(1,100); 

    $length = rand(1,1000); 

    echo subUTF8str($str,$begin,$length)."\n"; 

下次有机会写其他编码格式的

    本文转自kefirking 51CTO博客,原文链接:,http://blog.51cto.com/phpzf/794660如需转载请自行联系原作者