php截取字符串之截取utf8或gbk编码的中英文字符串示例

 php中自带strlen是返回的字节数,对于utf8编码的中文返回时3个,不满足需求,下面给大家提供一个方法来完成这样的功能

微博的发言有字数限制,其计数方式是,中文算2个,英文算1个,全角字符算2个,半角字符算1个。
php中自带strlen是返回的字节数,对于utf8编码的中文返回时3个,不满足需求。
mb_strlen 可以根据字符集计算长度,比如utf8的中文计数为1,但这不符合微博字数限制需求,中文必须计算为2才可以。
google了下,找到一个discuz中截取各种编码字符的类,改造了下,已经测试通过.其中参数$charset 只支持gbk与utf-8。
 
 代码如下:
$a = "s@@你好";
var_dump(strlen_weibo($a,'utf-8'));
 
 
结果输出为8,其中字母s计数为1,全角@计数为2,半角@计数为1,两个中文计数为4。源码如下:
 
代码如下:
function strlen_weibo($string, $charset='utf-8')
{
    $n = $count = 0;
    $length = strlen($string);
    if (strtolower($charset) == 'utf-8')
    {
        while ($n < $length)
        {
            $currentByte = ord($string[$n]);
            if ($currentByte == 9 ||
                $currentByte == 10 ||
                (32 <= $currentByte && $currentByte <= 126))
            {
                $n++;
                $count++;
            } elseif (194 <= $currentByte && $currentByte <= 223)
            {
                $n += 2;
                $count += 2;
            } elseif (224 <= $currentByte && $currentByte <= 239)
            {
                $n += 3;
                $count += 2;
            } elseif (240 <= $currentByte && $currentByte <= 247)
            {
                $n += 4;
                $count += 2;
            } elseif (248 <= $currentByte && $currentByte <= 251)
            {
                $n += 5;
                $count += 2;
            } elseif ($currentByte == 252 || $currentByte == 253)
            {
                $n += 6;
                $count += 2;
            } else
            {
                $n++;
                $count++;
            }
            if ($count >= $length)
            {
                break;
            }
        }
        return $count;
    } else
    {
        for ($i = 0; $i < $length; $i++)
        {
            if (ord($string[$i]) > 127)
            {
                $i++;
                $count++;
            }
            $count++;
        }
        return $count;
    }
}

时间: 2024-10-26 04:47:02

php截取字符串之截取utf8或gbk编码的中英文字符串示例的相关文章

php截取字符串之截取utf8或gbk编码的中英文字符串示例_php实例

微博的发言有字数限制,其计数方式是,中文算2个,英文算1个,全角字符算2个,半角字符算1个.php中自带strlen是返回的字节数,对于utf8编码的中文返回时3个,不满足需求.mb_strlen 可以根据字符集计算长度,比如utf8的中文计数为1,但这不符合微博字数限制需求,中文必须计算为2才可以.google了下,找到一个discuz中截取各种编码字符的类,改造了下,已经测试通过.其中参数$charset 只支持gbk与utf-8. 复制代码 代码如下: $a = "s@@你好";

php中序列化与反序列化在utf8和gbk编码中测试

php 在utf8和gbk编码下使用serialize和unserialize互相序列化和反序列化会出现无法成功反序列化的问题. 问题出现的原因主要是在不同编码下strlen函数计算中文字符串长度不同的原因.  代码如下 复制代码 <?php $array=array('title'=>'php教程分享网','url'=>'http://www.111cn.net'); echo serialize($array); //gbk编码  a:2:{s:5:"title"

在php中如何使用json_decode解析gbk编码的json字符串

今天看到csdn的bbs上有人问如何用json_decode解析gbk编码的串. 大家都知道,json都是utf8编码的.json_encode后的字符串都是会变成"\u4fe1\u6d77\u9f99"格式. 如下面的代码: $arr = "信海龙"; echo json_encode($arr); 输出结果为:"\u4fe1\u6d77\u9f99" 如果你有一个符合json格式的gbk编码的字符串,如何使用json_decode进行解析呢?

基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)

php导入到excel乱码是因为utf8编码在xp系统不支持所有utf8编码转码一下就完美解决了utf-8编码案例Php代码 复制代码 代码如下: <?php header("Content-Type: application/vnd.ms-excel; charset=UTF-8"); header("Pragma: public"); header("Expires: 0"); header("Cache-Control: m

基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)_php技巧

php导入到excel乱码是因为utf8编码在xp系统不支持所有utf8编码转码一下就完美解决了utf-8编码案例Php代码 复制代码 代码如下: <?php header("Content-Type: application/vnd.ms-excel; charset=UTF-8"); header("Pragma: public"); header("Expires: 0"); header("Cache-Control: m

PHP 字符串编码截取函数(兼容utf-8和gb2312)_php实例

复制代码 代码如下: //截取字符串长度.支持utf-8和gb2312编码.若为gb2312,先将其转为utf-8,在utf-8的基础上截取然后再转换回来 function cut_string($str,$from=1,$length=10,$code='utf-8',$rear='...'){     if($code!='utf-8'){//总是将字符串转为utf-8编码         $str=iconv($code,'utf-8',$str);     }     $str_len=

php中文汉字字符串的截取问号

php在操作字符串的问题时间无非两个问题: 1.判断字符串编码是gbk还是unicode. 2.对相应编码采取相应截取方法. 一般情况下我们使用substr截取汉字可能会遇到乱码问题.因为汉字是双字节的,当被截取了一个字节时,这个汉字就无法显示,乱掉了. 其实解决很简单,看下面的截取函数:  代码如下 复制代码 //截取超长字符串 function curtStr($str,$len=30){  if(strlen($str)>$len){   $str = substr($str,0,$len

php中支持多种编码的中文字符串截取函数!_php技巧

支持多种编码的中文字符串截取函数!   复制代码 代码如下: /*     * @todo 中文截取,支持gb2312,gbk,utf-8,big5      *     * @param string $str 要截取的字串     * @param int $start 截取起始位置     * @param int $length 截取长度     * @param string $charset utf-8|gb2312|gbk|big5 编码      * @param $suffix

中英文字符串截取函数(包括html)

  中英文字符串截取函数(包括html) function get_word($string, $length, $dot = '..',$charset='gbk') { if(strlen($string) <= $length) { return $string; } $string = str_replace(array(' ',' ', '&', '"', '<', '>'), array('','','&', '"', '<', '&