$a="我是我是啊";
//OK
echo substr($a,0,1);
echo substr($a,0,2);
echo substr($a,0,3);
echo substr($a,0,4);
//unable
echo substr($a,3,5);

解决方案 »

  1.   

    //mb_internal_encoding("UTF-8");//你的编码 
    $s = "中文中文字符"; 
    echo mb_substr($s,1,1,'UTF-8');
      

  2.   


    //截取中文字符串
    function mysubstr($str, $start, $len) {
        $tmpstr = "";
        $strlen = $start + $len;
        for($i = 0; $i < $strlen; $i++) {
            if(ord(substr($str, $i, 1)) > 0xa0) {
                $tmpstr .= substr($str, $i, 2);
                $i++;
            } else
                $tmpstr .= substr($str, $i, 1);
        }
        return $tmpstr;
    }
      

  3.   

    $str="一1二2三3四4五5六6七7";
    echo mb_substr($str, 0, 1, 'utf-8');不过也不是万能的,在第三个参数为3的时候,也出现乱码了.
    最好自己写个函数.来处理这种情况.
      

  4.   

    还没听说过,手册上明确指出mb_substr,对多字节是安全的,
    如果还出现乱码,检查编码,替换 UTF-8 那个参数,楼主还是下个手册翻翻把,总是要下的……
      

  5.   

    我以前做java的时候解决过这个问题,但是也是很复杂,由于我不太熟悉php,各种函数都没学过
    那时我的关键解决思路是
    获得$str的字节数组java的代码是byte[] byteStr = str.getBytes();
    如果str = "中国人";
    那么所获得的数组byteStr就有6个byte类型的元素,byteStr[0]和byteStr[1]代表的就是“中”这个字
    for(int i=0; i < str.length();i++) { //str.length()在这里返回3
        String tempStr = str.charAt(i);  //3次循环中,分别返回“中”,“国”,“人”。
        byte[] b = tempStr.getBytes();
        if(b.length == 1){
             //说明是单字节
        }else{
             //说明是两个字节,或两个字节以上
        }
    }我用java能解决,但是php由于是初学,根本不知道各种函数的用法
    希望大家能根据我的思路,把java代码翻译成php的代码
      

  6.   

    不是把,这样都行,你在csdn下载频道搜索 php5中文手册把……
    还有你还乱码,在之前发送个header头看看,此外你那个php文件保存的时候 是什么编码
    如果保存 ansi,发送 gb2312之类,如果UTF-8,就发送UTF-8
    或者之前用iconv转换编码<?
    header('Content-Type: text/html; charset=UTF-8');$s = "中文中文字符"; 
    echo mb_substr($s,1,1,'UTF-8'); 
    ?>或者<?
    header('Content-Type: text/html; charset=UTF-8');//虽然你文件本身保存的是ansi,但是输出头是UTF-8$str="一1二2三3四4五5六6七7"; $str=iconv('gb2312','UTF-8',$str);//那么把gb2312,或gbk之类的,用iconv转换成UTF-8echo mb_substr($str, 0, 3,'UTF-8'); //最终你用 mb_substr带入 UTF-8,还是正确的
    ?>