php中的escape函数

原创
2016-06-08 17:31:29 2101浏览

在json中不支持中文,用它传送中文数据就会出现数据丢失或者乱码,必须在传送前对要发送的字符串进行编码,由于传送过去需要用js进行数据解析,考虑到js中有unescape函数,故若在php中有个escape函数,对数据进行编码,在客户端用unescape进行 解码,这样就会方便很多。

先在网上搜索一把,很多用php实现的escape函数,大同小异,比如下面一个:

function phpEscape($str) {
preg_match_all("/[x80-xff].|[x01-x7f]+/",$str,$r);
$ar = $r[0];
foreach($ar as $k=>$v) {
if(ord($v[0]) $ar[$k] = rawurlencode($v);
else
$ar[$k] = "%u".bin2hex(iconv("GB2312","UCS-2",$v));
}
return join("",$ar);
}

这个函数可以很好的工作,但是,也许有新手不理解这个函数的原理(比如我),用起来总是不放心,现在我就来解释一下这个函数的原理。而且我认为,拿别人的代码来复用,好比站在了巨人的肩膀上,但是若不理解别人的代码,迟早要掉到地面上。

第一句: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($ar as $k=>$v) {
if(ord($v[0]) $ar[$k] = rawurlencode($v); //直接用rawurlencode编码
else
$ar[$k] = "%u".bin2hex(iconv("GB2312","UCS-2",$v)); //否则的话用iconv函数把汉字转变成ucs-2编码,也就是unicode编码
}

这个就是关于php中escape函数的一个实现,欢迎大家补充




声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
上一条:常见PHP套件整理 下一条:简易PHP抓网页