解决办法:采用js对URL中的汉字进行escape编码。
<ahref=""onclick="window.open('PRoduct_list.php?p_sort='+escape('PHP开发资源网'));">
这样点击链接后的效时:引用:http://127.0.0.1/shop/product_list.php?p_sort=PHP%u5F00%u53D1%u8D44%u6E90%u7F51生成了这样的效果,很明显用PHP的urldecode()或者base64_decode()是无法反解的。解决方法,用PHP写一个反解函数:
functionjs_unescape($str){$ret='';$len=strlen($str);for($i=0;$i<$len;$i++){if($str[$i]=='%'&&$str[$i+1]=='u'){$val=hexdec(substr($str,$i+2,4));if($val<0x7f)$ret.=chr($val);elseif($val<0x800)$ret.=chr(0xc0|($val>>6)).chr(0x80|($val&0x3f));else$ret.=chr(0xe0|($val>>12)).chr(0x80|(($val>>6)&0x3f)).chr(0x80|($val&0x3f));$i+=5;}elseif($str[$i]=='%'){$ret.=urldecode(substr($str,$i,3));$i+=2;}else$ret.=$str[$i];}return$ret;}
注意JS编码会自动转换成为UTF-8,所以必须进行编码转换才能得到正确的结果,否则会中文乱码。代码如下:
printiconv('utf-8','gb2312',js_unescape($_REQUEST['p_sort']));
到此我们就成功地反解了js的escape编码了。如下:引用:PHP开发资源网另外我找到个用PHP实现js的escape编码的函数:
functionphpescape($str){$sublen=strlen($str);$retrunString="";for($i=0;$i<$sublen;$i++){if(ord($str[$i])>=127){$tmpString=bin2hex(iconv("gb2312","ucs-2",substr($str,$i,2)));//$tmpString=substr($tmpString,2,2).substr($tmpString,0,2);window下可能要打开此项$retrunString.="%u".$tmpString;$i++;}else{$retrunString.="%".dechex(ord($str[$i]));}}return$retrunString;}
大家是否遇到过这种问题呢?