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;
}