当前位置:首页 > PHP教程 > php应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2020-10-27 14:02:47 浏览: 评论:0 

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

微博的发言有字数限制,其计数方式是,中文算2个,英文算1个,全角字符算2个,半角字符算1个。

php中自带strlen是返回的字节数,对于utf8编码的中文返回时3个,不满足需求。

mb_strlen 可以根据字符集计算长度,比如utf8的中文计数为1,但这不符合微博字数限制需求,中文必须计算为2才可以。

google了下,找到一个discuz中截取各种编码字符的类,改造了下,已经测试通过.其中参数$charset 只支持gbk与utf-8,代码如下:

  1. $a = "s@@你好"
  2. var_dump(strlen_weibo($a,'utf-8')); 

结果输出为8,其中字母s计数为1,全角@计数为2,半角@计数为1,两个中文计数为4,源码如下:

  1. function strlen_weibo($string$charset='utf-8'
  2.     $n = $count = 0; 
  3.     $length = strlen($string); 
  4.     if (strtolower($charset) == 'utf-8'
  5.     { 
  6.         while ($n < $length
  7.         { 
  8.             $currentByte = ord($string[$n]); 
  9.             if ($currentByte == 9 || 
  10.                 $currentByte == 10 || 
  11.                 (32 <= $currentByte && $currentByte <= 126)) 
  12.             { 
  13.                 $n++; 
  14.                 $count++; 
  15.             } elseif (194 <= $currentByte && $currentByte <= 223) 
  16.             { 
  17.                 $n += 2; 
  18.                 $count += 2; 
  19.             } elseif (224 <= $currentByte && $currentByte <= 239) 
  20.             { 
  21.                 $n += 3; 
  22.                 $count += 2; 
  23.             } elseif (240 <= $currentByte && $currentByte <= 247) 
  24.             { 
  25.                 $n += 4; 
  26.                 $count += 2; 
  27.             } elseif (248 <= $currentByte && $currentByte <= 251) 
  28.             { 
  29.                 $n += 5; 
  30.                 $count += 2; 
  31.             } elseif ($currentByte == 252 || $currentByte == 253) 
  32.             { 
  33.                 $n += 6; 
  34.                 $count += 2; 
  35.             } else 
  36.             { 
  37.                 $n++; 
  38.                 $count++; 
  39.             } 
  40.             if ($count >= $length
  41.             { 
  42.                 break
  43.             } 
  44.         } 
  45.         return $count
  46.     } else 
  47.     { 
  48.         for ($i = 0; $i < $length$i++) 
  49.         { 
  50.             if (ord($string[$i]) > 127) 
  51.             { 
  52.                 $i++; 
  53.                 $count++; 
  54.             } 
  55.             $count++; 
  56.         } 
  57.         return $count
  58.     } 

Tags: php截取字符串

分享到: