在GB编码下,可以用
$str = "中";
if(ord($str[$i])>0x80) echo "是中文";
那在UTF8编码下,有没有类似的方法实现呢

解决方案 »

  1.   

    中文在utf8里都是3个字节
    所以第一个字节是1110开头,也就是>0xE0当然,3个字节的不全是中文,但是如果你的应用不是世界各国的字符都用的话,
    一般也就没问题了
      

  2.   


    function is_utf8($string)
    {
    return preg_match('%^(?:
    [\x09\x0A\x0D\x20-\x7E] # ASCII
    | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
    | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
    | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
    | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
    | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
    | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
    | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
    )*$%xs', $string);
    }
      

  3.   

    function is_utf8($string)
    {
    return preg_match('%^(?:
    [\x09\x0A\x0D\x20-\x7E] # ASCII
    | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
    | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
    | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
    | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
    | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
    | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
    | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
    )*$%xs', $string);
    }上面的怎么被截断了。
      

  4.   

    /****************************************
    * 中文字符串截取(3)(支持GB2312/GBK/UTF-8/BIG5)
    * @param string $str 要截取的字串
    * @param int $start 截取起始位置
    * @param int $length 截取长度
    * @param string $charset 字符串的字符集,包括有 utf-8|gb2312|gbk|big5 编码
    * @param bool $suffix 是否加尾缀
    * @return string 返回接续字符串的结果
    ****************************************/
    function CSubstr($str, $start=0, $length, $charset="utf-8", $suffix=false){
    if(function_exists("mb_substr")){
    return mb_substr($str, $start, $length, $charset);
    }
    $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
    $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
    $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
    $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
    preg_match_all($re[$charset], $str, $match);
    $slice = join("", array_slice($match[0], $start, $length));
    if($suffix) {
    return $slice ."…";
    }
    return $slice;
    }