- function utf8_gb2312($str, $default = 'gb2312') 
 
	- { 
 
	-     $str = preg_replace("/[x01-x7f]+/", "", $str); 
 
	-     if (emptyempty($str)) return $default; 
 
	-      
 
	-     $preg =  array( 
 
	-         "gb2312" => "/^([xa1-xf7][xa0-xfe])+$/",  
 
	-         "utf-8" => "/^[x{4e00}-x{9fa5}]+$/u",       
 
	-     ); 
 
	-     if ($default == 'gb2312') { 
 
	-         $option = 'utf-8'; 
 
	-     } else { 
 
	-         $option = 'gb2312'; 
 
	-     } 
 
	-     if (!preg_match($preg[$default], $str)) { 
 
	-         return $option; 
 
	-     } 
 
	-     $str = @iconv($default, $option, $str); 
 
	-      
 
	-      
 
	-     if (emptyempty($str)) { 
 
	-         return $option; 
 
	-     } 
 
	 
 
默认编码是gb2312,而且我统计了一下,90%的情况下都是gb2312,所以,我的检测函数不能出现本来是gb2312的,结果被检测出utf8. 基本思路是: 
1. 把所有的ascii去掉,如果全部都是ascii,那么就是gb2312。 
2. 假设这个字符串是gb2312,用一个正则检查它是否是真的gb2312,如果不是,那么就是utf-8 
3. 然后,用iconv 把字符串转换成utf8,如果转换不成功,那么原来可能不是真正的一个gb2312编码的字符(用正则匹配我已经尽量精确,但是,gb2312的编码不是连续的,还是会有空洞),那么最后的编码就是utf-8. 
4. 否则就是gb2312 编码:加入这样的检查功能后,在1000个关键字里面,就出现了1个乱码,比以前的近100个关键字乱码少了很多。 
      
      (责任编辑:admin) |