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

Tags: php截取字符串

分享到: