php如何获取中文字符长度,一个中文字符算一个

页面字符集big5,我想要用php获取字符串(字符串有字母,数字,中文等)的长度。字母,数字,符号,中文(包括简体和繁体中文)都算一个字符。谢谢!

在PHP中专门的mb_substr和mb_strlen函数,可以对中文进行截取和计算长度,但是,由于这些函数并非PHP的核心函数,所以,它们常常有可能没有开启。要在php.ini中开启即可。获取长度实例:1 ,utf-8环境下使用

header('Content-type:text/html;charset=utf-8');
/**
* å¯ä»¥ç»Ÿè®¡ä¸­æ–‡å­—符串长度的函数
* @param $str è¦è®¡ç®—长度的字符串
* @param $type è®¡ç®—长度类型,0(默认)表示一个中文算一个字符,1表示一个中文算两个字符
*
*/
function abslength($str)
{
    if(empty($str)){
        return 0;
    }
    if(function_exists('mb_strlen')){
        return mb_strlen($str,'utf-8');
    }
    else {
        preg_match_all("/./u", $str, $ar);
        return count($ar[0]);
    }
}
$str = '我们都是中国人啊,ye!';
$len = abslength($str);
var_dump($len);  //return 12
$len = abslength($str,'1');
echo '<br />'.$len;  //return 22
 
/*
    utf-8编码下截取中文字符串,参数可以参照substr函数
    @param $str è¦è¿›è¡Œæˆªå–的字符串
    @param $start è¦è¿›è¡Œæˆªå–的开始位置,负数为反向截取
    @param $end è¦è¿›è¡Œæˆªå–的长度
*/
function utf8_substr($str,$start=0) {
    if(empty($str)){
        return false;
    }
    if (function_exists('mb_substr')){
        if(func_num_args() >= 3) {
            $end = func_get_arg(2);
            return mb_substr($str,$start,$end,'utf-8');
        }
        else {
            mb_internal_encoding("UTF-8");
            return mb_substr($str,$start);
        }       
 
    }
    else {
        $null = "";
        preg_match_all("/./u", $str, $ar);
        if(func_num_args() >= 3) {
            $end = func_get_arg(2);
            return join($null, array_slice($ar[0],$start,$end));
        }
        else {
            return join($null, array_slice($ar[0],$start));
        }
    }
}
$str2  = 'wo要截取zhongwen';
echo '<br />';
echo utf8_substr($str2,0,-4); //return wo要截取zhon

2,支持gb2312,gbk,utf-8,big5 中文截取方法

/* 

 

* 中文截取,支持gb2312,gbk,utf-8,big5 

 

 

* @param string $str 要截取的字串 

 

* @param int $start 截取起始位置 

 

* @param int $length 截取长度 

 

* @param string $charset utf-8|gb2312|gbk|big5 编码 

 

* @param $suffix 是否加尾缀 

 

*/

 

public function csubstr($str, $start=0, $length, $charset="utf-8", $suffix=true) 

 

 

   if(function_exists("mb_substr")) 

 

   { 

 

       if(mb_strlen($str, $charset) <= $length) return $str; 

 

       $slice = mb_substr($str, $start, $length, $charset); 

 

   } 

 

   else

 

   { 

 

       $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); 

 

       if(count($match[0]) <= $length) return $str; 

 

       $slice = join("",array_slice($match[0], $start, $length)); 

 

   } 

 

   if($suffix) return $slice."…"; 

 

   return $slice; 

 

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-06
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=big5" />
<title>Untitled Document</title>
</head>

<body>
<?php
$str="a撒sdfsd阿斯顿发生上的1";
function abslength($str){
$len=strlen($str);
$i=0; $j=0;
while($i<$len)
{
if(preg_match("/^[".chr(0xa1)."-".chr(0xf9)."]+$/",$str[$i]))
{
$i+=2;
}
else
{
$i+=1;
}
$j++;
}
return $j;
}

echo abslength($str);
?>
</body>
</html>
跟gbk模式下差不多本回答被提问者采纳
相似回答