首先,我用preg_match_all('/[\x80-\xff]./', $s,$arr);检测是否有中文字符,然后打印出$arr,查看中文字符有哪些,再对应修改,但是打印$arr都是乱码,用了几种GB2312转UTF-8的方法都不行。
各位帮忙提供一些方法。

解决方案 »

  1.   

    你是要判断汉字还是不理会编码只判断GBK内汉字的情况呢?因为对后者来说,GBK / Shift-JIS / EUC-KR(中日韩)……内码都是相同的,这样不考虑其他编码才能成立unicode的汉字范围是 
    基础字符:4E00-9FCF
    Extendsion A: 3400-4DBF 这个还在基础部分的前面,要留意
    Extendsion B: 20000-2A6D6
    Extendsion C: 2A700-2B734
    Extendsion D: 2B740-2B81D其他:
    31A0-31BA 还有……请去unicode官网查询
      

  2.   

    1、utf-8 是这样编码的:
    U+007F  0xxxxxxx
    U+07FF  110xxxxx 10xxxxxx
    U+FFFF  1110xxxx 10xxxxxx 10xxxxxx
    U+1FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    U+3FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    U+7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx2、由此可知中文的正则表达式规则串为
    /^(?:[\x00-\x7f]|[\xc0-\xff][\x80-\xbf]+)+$/3、手册中附录了这样的函数
    function is_utf8($str) {
        $c=0; $b=0;
        $bits=0;
        $len=strlen($str);
        for($i=0; $i<$len; $i++){
            $c=ord($str[$i]);
            if($c > 128){
                if(($c >= 254)) return false;
                elseif($c >= 252) $bits=6;
                elseif($c >= 248) $bits=5;
                elseif($c >= 240) $bits=4;
                elseif($c >= 224) $bits=3;
                elseif($c >= 192) $bits=2;
                else return false;
                if(($i+$bits) > $len) return false;
                while($bits > 1){
                    $i++;
                    $b=ord($str[$i]);
                    if($b < 128 || $b > 191) return false;
                    $bits--;
                }
            }
        }
        return true;
    }4、从 php5.3 起, mb_string 扩展提供了 mb_check_encoding 函数
    if(mb_check_encoding($s, 'utf-8')) echo 'yes';
      

  3.   


    由 preg_match_all('/^(?:[\x00-\x7f]|[\xc0-\xff][\x80-\xbf]+)+$/', $s,$arr);
    只是返回有中文字符的那段文字,不能说具体哪个是中文字符
      

  4.   

    我不是让你把这些发给客户看,是给你个思路,你就可以根据范围正则提取汉字显示了
    例如 [\u4e00-\u9fcf],都习惯了让人家写好代码给你用么?看来我的思想过时了
      

  5.   

    如果你要逐个汉字输出的话,就用基于unicode字串的preg_filter()和preg_split(),拆开单个字符判断
      

  6.   

    Example #2 将一个字符串分隔为组成它的字符 
    <?php
    $str = 'string';
    $chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
    print_r($chars);
    ?> 
      

  7.   


    我用这个匹配preg_match_all('/[\x80-\xff]./', $s,$arr);是可以找到某段话是否有中文字符,只是返回的值print_r($arr); 是乱码了。
      

  8.   


    打印出来是这个 Array ( [0] => Array ( [0] => � ) ) 
      

  9.   

    启发你这么多次都没有效果,不再纠结这个了这样说,你的判断把范围扩大了,"."包含传换行符以外的字符
    在不指定编码时——preg函数本身就无编码的概念,就有可能把GBK汉字后半部分和另一个字符(ASCII或者后面一个汉字的前半部分)判断出来了,这就是乱码了,说白了就是判断错了判断汉字要么用版主的程序,要么转unicode整字匹配
    \u4e00就是整字匹配另一种方法是先用iconv() 从GBK->utf-8,然后用
    $chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
    也是整字拆分的,不会从汉字中间拆开,然后对数组$chars逐个检查
    或者准备一个ASCII字符的数组,和$chars求差集,也能得到相对较好的结果再不明白我也没办法了