免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3416 | 回复: 9
打印 上一主题 下一主题

段判断字符是否是UTF8的代码太慢了,看看怎么优化 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-10 23:22 |只看该作者 |倒序浏览

  1. function is_utf8($str) {
  2.     $c=0; $b=0;
  3.     $bits=0;
  4.     $len=strlen($str);
  5.     for($i=0; $i<$len; $i++){
  6.         $c=ord($str[$i]);
  7.         if($c > 128){
  8.             if(($c >= 254)) return false;
  9.             elseif($c >= 252) $bits=6;
  10.             elseif($c >= 248) $bits=5;
  11.             elseif($c >= 240) $bits=4;
  12.             elseif($c >= 224) $bits=3;
  13.             elseif($c >= 192) $bits=2;
  14.             else return false;
  15.             if(($i+$bits) > $len) return false;
  16.             while($bits > 1){
  17.                 $i++;
  18.                 $b=ord($str[$i]);
  19.                 if($b < 128 || $b > 191) return false;
  20.                 $bits--;
  21.             }
  22.         }
  23.     }
  24.     return true;
  25. }
复制代码


另一段速度要快些,但有时会判断出错。



  1.        function getUTF8str($value_1)
  2.        {
  3.                           $value_2   =   @iconv("gb18030//IGNORE","utf-8//IGNORE",$value_1);
  4.                           $value_3   =   @iconv("utf-8//IGNORE","gb18030//IGNORE",$value_2);  

  5.                           if(strlen($value_1) == strlen($value_3)){
  6.                                   return $value_2;
  7.                           }else{
  8.                                   return $value_1;
  9.                           }
  10.        }
复制代码

论坛徽章:
0
2 [报告]
发表于 2009-06-11 08:20 |只看该作者
/**
* 函数 is_utf8
* 功能 检查传入的串是否为utf-8编码串
* 返回 逻辑,是 true,不是 false
**/
if(! function_exists('is_utf8')):
function is_utf8($s) {
          if(preg_match('/^(?:[\x00-\x7f]|[\xc0-\xff][\x80-\xbf]+)+$/', $s)) {
                  return true;
          }
          return false;
}
endif;

论坛徽章:
0
3 [报告]
发表于 2009-06-11 09:30 |只看该作者
用正则的确要快些,我先用用,看会不会有出错的时候。

[ 本帖最后由 skybyte 于 2009-6-11 09:35 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-06-11 09:45 |只看该作者
PHP有mb_函数族的!可以更快!!

论坛徽章:
0
5 [报告]
发表于 2009-06-11 10:30 |只看该作者
mb那个判断字符集也是有时会出错

论坛徽章:
0
6 [报告]
发表于 2009-06-11 13:21 |只看该作者
为什么要判断是不是utf-8?
说一下想做什么?是不是可以用别的方法来达到最终目的??!

论坛徽章:
0
7 [报告]
发表于 2009-06-12 12:28 |只看该作者
为什么要判断是不是uft8字符呢?
一般都是直接操作的。

  1. "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
复制代码

就用这个正则就可以了

论坛徽章:
0
8 [报告]
发表于 2009-06-16 09:20 |只看该作者
用正则还是不行,经常出现段错误。

论坛徽章:
0
9 [报告]
发表于 2011-08-26 09:49 |只看该作者
回复 1# skybyte


    用这个 mb_detect_encoding()

论坛徽章:
0
10 [报告]
发表于 2011-08-26 11:39 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP