gbk和utf8编码自动识别方法[php版]

目前中文网页主流的编码为gbk和utf8两种编码。因此,我们做编码识别的前提是,编码不是gbk就是utf8.
编码自动识别的基本思想如下:
1.看给定的字节串是否符合utf8编码规则。如果不符合则为gbk编码。具体utf8编码规则件日志《utf8编码规则》。
2.如果给定的字节串中没有符合utf8三字节规则的,则为gbk编码。中文在utf8中占三个字节。
3.如果给定的字节串能对应上gbk编码中的中文,且无法对应上utf8编码中的中文,则为gbk编码。
4.特殊情况,特殊处理。如 “鏈條” 和 “瑷媄”。
总体思想是,先默认为utf8编码,再根据一些非utf8编码的情况逐步筛选。

准确率和效率还是不错的。20万多条query,1秒钟就可以处理完。

php代码如下:

function detect_encoding($str){
    $len = strlen($str);
    $encoding = "utf8";
    $is_utf8_chinese = false;
    for ($i = 0; $i < $len; $i++) {
        if ( (ord($str[$i]) >> 7) > 0 ) { //非ascii字符
            if (ord($str[$i]) <= 191 ) {
                $encoding = "gbk0";
                break;
            } else if ( ord($str[$i]) <= 223 ) { //前两位为11
                if ( empty($str[$i+1]) or  ord($str[$i+1]) >> 6 != 2 ) { //紧跟后两位为10
                    $encoding = "gbk1";
                    break;
                } else {
                    $i += 1;
                }
            } else if ( ord($str[$i]) <= 239 ) { //前三位为111
                if ( empty($str[$i+1]) or  ord($str[$i+1]) >> 6 != 2 or empty($str[$i+2]) or  ord($str[$i+2]) >> 6 != 2) { //紧跟后两位为10
                    $encoding = "gbk2";
                    break;
                } else {
                    $i += 2;
                    $is_utf8_chinese = true;
                }
            } else if ( ord($str[$i]) <= 247 ) { //前四位为1111
                if ( empty($str[$i+1]) or  ord($str[$i+1]) >> 6 != 2 or empty($str[$i+2]) or  ord($str[$i+2]) >> 6 != 2 or empty($str[$i+3]) or  ord($str[$i+3]) >> 6 != 2) { //紧跟后两位为10
                    $encoding = "gbk3";
                    break;
                } else {
                    $i += 3;
                }
            } else if ( ord($str[$i]) <= 251 ) { //前五位为11111
                if ( empty($str[$i+1]) or  ord($str[$i+1]) >> 6 != 2 or empty($str[$i+2]) or  ord($str[$i+2]) >> 6 != 2 or empty($str[$i+3]) or  ord($str[$i+3]) >> 6 != 2 or empty($str[$i+4]) or  ord($str[$i+4]) >> 6 != 2) { //紧跟后两位为10
                    $encoding = "gbk4";
                    break;
                } else {
                    $i += 4;
                }
            } else if ( ord($str[$i]) <= 253 ) { //前六位为111111
                if ( empty($str[$i+1]) or  ord($str[$i+1]) >> 6 != 2 or empty($str[$i+2]) or  ord($str[$i+2]) >> 6 != 2 or empty($str[$i+3]) or  ord($str[$i+3]) >> 6 != 2 or empty($str[$i+4]) or  ord($str[$i+4]) >> 6 != 2 or empty($str[$i+5]) or  ord($str[$i+5]) >> 6 != 2 ) { //紧跟后两位为10
                    $encoding = "gbk5";
                    break;
                } else {
                    $i += 5;
                }
            } else {
                $encoding = "gbk6";
                break;
            }
        }
    }

    if ($is_utf8_chinese == false){
        $encoding = "gbk10";
    }
    if ($encoding == "utf8" && preg_match("/^[".chr(0xa1)."-".chr(0xff)."\x20-\x7f]+$/", $str) && !preg_match("/^[\x{4e00}-\x{9fa5}\x20-\x7f]+$/u", $str)) {
        $encoding = "gbk7";
    }
    //echo $encoding;
    if ($encoding == "utf8") {
        //echo "utf8";
        return ($str == "鏈條" || $str == "瑷媄")? $str: mb_convert_encoding($str, "gbk", "utf8");
    } else {
        //echo "gbk";
        return $str;
    }
}

记得代码最好在gbk编码中运行,因为代码中有汉字($str == "鏈條" || $str == "瑷媄")比较。当然你可以在utf8编码中运行,只要把汉字处理下。

时间: 2024-09-15 17:12:20

gbk和utf8编码自动识别方法[php版]的相关文章

php自定义函数实现汉字转换utf8编码的方法_php技巧

本文实例讲述了php自定义函数实现汉字转换utf8编码的方法.分享给大家供大家参考,具体如下: 该函数有两部分组成: function htou($c) { $n = (ord($c[0]) & 0x1f) << 12; $n += (ord($c[1]) & 0x3f) << 6; $n += ord($c[2]) & 0x3f; return $n; } //在代码中隐藏utf8格式的字符串 function utf8_unicode($str) { $

Shell脚本把文件从GBK转为UTF-8编码_linux shell

shell 脚本: #!/bin/sh ## ## convert file from GB2312 to UTF-8 ## path="$1" unset opt if [ "$2" = "force" ]; then opt="-c -s" fi if [ -z "$path" ]; then echo "nUsage: $0 <file or dir>n" elif [

将字符串转换成gb2312或者utf-8编码的参数(js版)_javascript技巧

在很多时候,我们直接在url中传递中文参数时,读到的中文都是乱码,那么我们应该怎么将这些参数转换呢? 下面我们来介绍一下方法 1.我们新建一个 UrlEncode.js 然后将下面的代码拷贝进去 复制代码 代码如下: //JS版的Server.UrlEncode编码函数 String.prototype.UrlEncodeGB2312 = function () { var str = this; str = str.replace(/./g, function (sHex) { window.

判断网页编码的方法python版_python

在web开发的时候我们经常会遇到网页抓取和分析,各种语言都可以完成这个功能.我喜欢用python实现,因为python提供了很多成熟的模块,可以很方便的实现网页抓取. 但是在抓取过程中会遇到编码的问题,那今天我们来看一下如何判断网页的编码: 网上很多网页的编码格式都不一样,大体上是GBK,GB2312,UTF-8等. 我们在获取网页的的数据后,先要对网页的编码进行判断,才能把抓取的内容的编码统一转换为我们能够处理的编码,避免乱码问题的出现. 下面介绍两种判断网页编码的方法: 总结:第二个方法很准

PHP中GBK和UTF8编码处理

编码 一.编码范围 1. GBK (GB2312/GB18030)\x00-\xff  GBK双字节编码范围\x20-\x7f  ASCII\xa1-\xff  中文\x80-\xff  中文 2. UTF-8 (Unicode)\u4e00-\u9fa5 (中文)\x3130-\x318F (韩文\xAC00-\xD7A3 (韩文)\u0800-\u4e00 (日文)ps: 韩文是大于[\u9fa5]的字符 正则例子:preg_replace("/([\x80-\xff])/",&q

php 判断网页是否是utf8编码的方法

  //判断编码 .代码如下: $encode = mb_detect_encoding($q, array('GB2312','GBK','UTF-8')); echo $encode." "; if($encode=="GB2312") { $q = iconv("GBK","UTF-8",$q); } else if($encode=="GBK") { $q = iconv("GBK&quo

php 判断网页是否是utf8编码的方法_php技巧

//判断编码 复制代码 代码如下: $encode = mb_detect_encoding($q, array('GB2312','GBK','UTF-8'));echo $encode."<br/>";if($encode=="GB2312"){    $q = iconv("GBK","UTF-8",$q);}else if($encode=="GBK"){    $q = iconv(&

PHP中GBK和UTF8编码处理(中文,韩文)

一.编码范围 1. gbk (gb2312/gb18030) x00-xff gbk双字节编码范围 x20-x7f ascii xa1-xff 中文 x80-xff 中文 2. utf-8 (unicode) u4e00-u9fa5 (中文) x3130-x318f (韩文) xac00-xd7a3 (韩文) u0800-u4e00 (日文) ps教程: 韩文是大于[u9fa5]的字符 正则例子: preg_replace("/([x80-xff])/","",$s

Netbeans统一设置UTF-8编码解决方法

官方就有解决方法,这招可以解决目前所有的版本,全部文件将用UTF-8解码. 这是原文: For those who need to use international and multibyte characters, NetBeans can support UTF-8 editing. To enable it, go to your NetBeans installation directory and find the etc folder. There will be a file t