我改写的strlen和substr函数,支持汉字,看了后应该可以解决你的问题
注意这句:if(ord(substr($str,$cur,1))>127)  //是汉字
    //取字符串的自串,匹配汉字,当长度不指定或小于零时将从指定的开始点到末尾;
    //开始值如果为负值,则从右开始数
    function strlen1($str)
    {
             $count=0;          //字符个数;
             $strlen=strlen($str); //字符串的字节长度;
             $cur=0;              //读取的当前位置;             while($cur<$strlen)
             {
                   if(ord(substr($str,$cur,1))>127)  //是汉字
                   {
                      $count++;
                      $cur=$cur+2;
                   }
                   else                              //非汉字
                   {
                      $count++;
                      $cur++;
                   }
             }             return $count;
    }    function substr1($str,$start,$length=0)
    {
             $strarr=array();   //临时存储字符串把字符串读入该数组中,区分出汉字;
             $count=0;          //数组个数;
             $strlen=strlen($str); //字符串的字节长度;
             $cur=0;              //读取的当前位置;
             $begin=0;            //取字符串的开始位置;
             $end=0;              //取字符串的结束位置;
             $rarr=array();       //存放返回字符数组;
             $rstr="";               //存放返回字符串;             while($cur<$strlen)
             {
                   if(ord(substr($str,$cur,1))>127)  //是汉字
                   {
                      $strarr[$count++]=substr($str,$cur,2);
                      $cur=$cur+2;
                   }
                   else                              //非汉字
                   {
                      $strarr[$count++]=substr($str,$cur++,1);
                   }
             }             //得到开始值;             if($start<0)
             {
                $begin=$count+$start;
             }
             else
             {
                $begin=$start;
             }             //检验$begin的合法性,超过限制取0值
             if($begin<0)
                $begin=0;             //得到结束值;
             if($length==0)
                $end=$count-1;
             else
             {
                if($length>0)
                   $end=$begin+$length-1;
                elseif($length<0)
                   $end=$count+$length-1;
             }             //检验$end的合法性,超过限制取最末尾字符;
             if($end>=$count)
                $end=$count-1;             $tmp=0;
             for($i=$begin;$i<=$end;$i++)
             {
                 $rarr[$tmp++]=$strarr[$i];
             }             if($begin<=$end)
             {
                $rstr=implode("",$rarr);
             }             return $rstr;    }