<strong>采用js对URL中的汉字进行escape编码。 <br></strong><a href="" onclick="window.open('product_list.php?p_sort='+escape(''));">这样点击链接后的效时: <br>引用:http://127.0.0.1/shop/product_list.php?p_sort=PHP%u5F00%u53D1%u8D44%u6E90%u7F51<br>生成了这样的效果, 很明显用PHP的urldecode()或者base64_decode()是无法反解的。 <br><strong>解决方法, 用PHP写一个反解函数:</strong> <br><u>复制代码</u> 代码如下:<br>function js_unescape($str){ <br>$ret = ''; <br>$len = strlen($str); <br>for ($i = 0; $i { <br>if ($str[$i] == '%' && $str[$i+1] == 'u') <br>{ <br>$val = hexdec(substr($str, $i+2, 4)); <br>if ($val else if($val >6)).chr(0x80|($val&0x3f)); else $ret .= chr(0xe0|($val>>12)).chr(0x80|(($val>>6)&0x3f)).chr(0x80|($val&0x3f)); <br>$i += 5; <br>} <br>else if ($str[$i] == '%') <br>{ <br>$ret .= urldecode(substr($str, $i, 3)); <br>$i += 2; <br>} <br>else $ret .= $str[$i]; <br>} <br>return $ret;}<br><br>注意JS编码会自动转换成为UTF-8, 所以必须进行编码转换才能得到正确的结果,否则会中文乱码。但如果使用UTF-8编码就不用这一步了。<br><font style="COLOR: #ff0000">代码如下:print iconv('utf-8', 'gb2312', js_unescape($_REQUEST['p_sort'])); <br></font>到此我们就成功地反解了js的escape编码了。 <br>如下:<br>另外我找到个用PHP实现js的escape编码的函数:<br><u>复制代码</u> 代码如下:<br>function phpescape($str)<br>{ <br>$sublen=strlen($str);<br> $retrunString=""; <br>for ($i=0;$i{ <br>if(ord($str[$i])>=127) <br>{ <br>$tmpString=bin2hex(iconv("gb2312","ucs-2",substr($str,$i,2))); <br>//$tmpString=substr($tmpString,2,2).substr($tmpString,0,2);window下可能要打开此项 <br>$retrunString.="%u".$tmpString; <br>$i++; <br>} else <br>{ <br>$retrunString.="%".dechex(ord($str[$i])); <br>} <br>} <br>return $retrunString;<br>}<br><br>在json中不支持中文,用它传送中文数据就会出现数据丢失或者乱码,必须在传 送前对要发送的字符串进行编码,由于传送过去需要用js进行数据解析,考虑到js中有unescape函数,故若在php中有个escape函数,对数据 进行编码,在客户端用unescape进行 解码,这样就会方便很多。<br>先在网上搜索一把,很多用php实现的escape函数,大同小异,比如下面一个:<br><u>复制代码</u> 代码如下:<br>function phpEscape($str) {<br>preg_match_all("/[\x80-\xff].|[\x01-\x7f]+/",$str,$r);<br>$ar = $r[0];<br>foreach($ar as $k=>$v) {<br> if(ord($v[0]) $ar[$k] = rawurlencode($v);<br> else<br> $ar[$k] = "%u".bin2hex(iconv("GB2312","UCS-2",$v));<br>}<br>return join("",$ar);<br>}<br><br>这个函数可以很好的工作,但是,也许有新手不理解这个函数的原理(比如我),用起来总是不放心,现在我就来解释一下这个函数的原理。而且我认为,拿别人的代码来复用,好比站在了巨人的肩膀上,但是若不理解别人的代码,迟早要掉到地面上。<br><strong>第一句:</strong>preg_match_all("/[\x80-\xff].|[\x01-\x7f]+/",$str,$r);这个是用正则表达式匹配 字符串中所有的字符,[\x80-\xff]. 匹配的是汉字,\x表示匹配字符的16进制编码,[ ] 是类选择符,“.” 表示任意一个字符,这样[\x80-\xff].匹配的是两个字符,其中第一个就是16进制从80到ff的字符,而这恰好就是汉字编码的第一个字符。这样 就能完整的匹配一个汉字。关于unicode中汉字的编码,大家可以到网上搜索一下。同理,[\x01-\x7f]+英文字符串,因为最早的英文是 ASCII编码,编码值小于128,也就是16进制的从01到7f,"+"表示一个或者多个字符,这样[\x01-\x7f]+就能匹配连续多个英文字符 串。<br><u>复制代码</u> 代码如下:<br>$ar = $r[0]; //$r[0]里存放是匹配到的数组<br>foreach($ar as $k=>$v) {<br> if(ord($v[0]) $ar[$k] = rawurlencode($v); //直接用rawurlencode编码<br> else<br> $ar[$k] = "%u".bin2hex(iconv("GB2312","UCS-2",$v)); //否则的话用iconv函数把汉字转变成ucs-2编码,也就是unicode编码<br>}<br><br>在javascript中就可以用unescape来解码了<br>\u0391-\uFFE5 和\u4e00-\u9fa5来匹配中文 <br>但好像前者包含汉字下的A-¥等 后者可能是纯汉字。<br>其中解码函数为:<br><u>复制代码</u> 代码如下:<br>function unescape($str) {<br> $str = rawurldecode($str);<br> preg_match_all("/%u.{4}|.{4};|\d+;|.+/U",$str,$r);<br> $ar = $r[0];<br> foreach($ar as $k=>$v) {<br> if(substr($v,0,2) == "%u")<br> $ar[$k] = iconv("UCS-2","GBK",pack("H4",substr($v,-4)));<br> elseif(substr($v,0,3) == "")<br> $ar[$k] = iconv("UCS-2","GBK",pack("H4",substr($v,3,-1)));<br> elseif(substr($v,0,2) == "") {<br> $ar[$k] = iconv("UCS-2","GBK",pack("n",substr($v,2,-1)));<br> }<br> }<br> return join("",$ar);<br>}<br><br><strong><font style="COLOR: #ff0000">一、编码范围<br></font>1. GBK (GB2312/GB18030)<br></strong>\x00-\xff GBK双字节编码范围<br>\x20-\x7f ASCII<br>\xa1-\xff 中文<br>\x80-\xff 中文<br><strong>2. UTF-8 (Unicode)<br></strong>\u4e00-\u9fa5 (中文)<br>\x3130-\x318F (韩文<br>\xAC00-\xD7A3 (韩文)<br>\u0800-\u4e00 (日文)<br>ps: 韩文是大于[\u9fa5]的字符<br><strong>正则例子:<br></strong>preg_replace("/([\x80-\xff])/","",$str);<br>preg_replace("/([u4e00-u9fa5])/","",$str);<br> </a>