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

发表评论

电子邮件地址不会被公开。 必填项已用*标注