PHP: 判断字符串编码

时间:2011-3-11     作者:smarteng     分类: PHP相关


最近联盟这边遇到了这个情况,数据库中记录乱码,查找原因,

过程是这样的,外面投放广告,跳转到联盟,联盟记录cookie,之后header到最终页面,下单,订单组的同事取得cookie,入库。出问题的是sem的链接:http://union.dangdang.com/adlink_transfer.php?fromweb=400-f9c5d9e2fddaa5d205acd48e5c9fc729-%E6%B9%98%E8%A5%BF%E7%A7%98%E5%8F%B2&backurl=http://search.dangdang.com/search.php?key=%CF%E6%CE%F7%C3%D8%CA%B7

cookie记录应该是 400-f9c5d9e2fddaa5d205acd48e5c9fc729-湘西秘史 

当然浏览器里面是不可能看到中文的,

跳转页面是 gb2312的编码,

怎么会乱码呢 ?这个中文乱码还真是令人头痛的事情,

最后分析是这样: 这个transfer的URL是自己组装的,湘西秘史 这个几个字在sem投放的平台里面 是utf-8的编码,大家可以看一下 湘西秘史   这几个字 在 gb2312编码的时候,浏览器会转换成 : %CF%E6%CE%F7%C3%D8%CA%B7 ,在utf-8编码的时候 会转换成 : %E6%B9%98%E8%A5%BF%E7%A7%98%E5%8F%B2  ,现在可以看到差别了,是因为在投放平台的操作都是utf-8编码的,所以监控链接是gb2312的,编码不一致导致的 ,囧 ~~~~~

好吧,那我就改一下流程,如果非 gbk编码的我就iconv一下。so ,到网上找了一个判断gbk编码的函数,分享一下。

// 经常遇到这种情况,需要对URL中的字符串进行解码,例如Google中搜索“编码”,”编码”会转换为
%E7%BC%96%E7%A0%81,使用的是utf-8编码
// 综合了网上搜集的资料和GB/UTF-8编码方法,判断一个中英文混杂的字符串是用GB2312/GBK编码还是UTF-8编码
// 返回: true – 含GB编码 false – 为UTF-8编码
function is_gb2312($str)
{
        for($i=0; $i<strlen($str); $i++) {
                $v = ord( $str[$i] );
                if( $v > 127) {
                        if( ($v >= 228) && ($v <= 233) )
                        {
                                if( ($i+2) >= (strlen($str) – 1)) return true;  // not enough characters
                                $v1 = ord( $str[$i+1] );
                                $v2 = ord( $str[$i+2] );
                                if( ($v1 >= 128) && ($v1 <=191) && ($v2 >=128) && ($v2 <= 191) ) // utf编码
                                        return false;
                                else
                                        return true;
                        }
                }
        }
        return true;
}