URL encode 合成url参数的可靠性
从动态参数合成URL来看,是使用变量合成字符串,合成字符串会用到关联字符,比如本例中使用的“?” “=” “&” 之类,这就牵扯到“转义”的问题,即传入的变量含有这些字符的时候,不通过转义合成的URL将没法被解析,比如假设dc="12&a=";
则不转义合成的url为:
http://shmictrl.com/a.php?dc=12&a=&pc=100000
因此就产生了url encode对传入参数进行转义;具体算法如下:
被转义的字符 | 空格 | ! | # | $ | % | + | @ | : | = | ? | & |
---|---|---|---|---|---|---|---|---|---|---|---|
转义后 | %20 | %21 | %23 | %24 | %25 | %2B | %40 | %3A | %3D | %3F | %26 |
于是正确的url为:
http://shmictrl.com/a.php?dc=12%26a=&pc=100000
另由于客户端和服务器端有可能使用的汉字编码不同,因此URL传递的汉字可能会出现转码错误的情况,比如客户端使用的是GB2312的内码,而服务器使用的是UTF8的汉字内码,因此汉字在URL直接使用是不安全的,因此汉字也建议转换成%HEX2的方式合成URL;
因此,在SHMICTRL系统中可以使用下面函数完成URL encode:
str urlencode(str s){
//合成url时用的函数,可以把特殊字符和汉字转成%XX的格式
str us=" !#$%+@:=?&";
str o="";
int i;
int c;
int len;
len=strlen(s);
for (i=0;i<len;i++){
c=asc(s,i);
if (strpos(us,substr(s,i,1))>=0){
o=o+"%"+int2hex(c,2);
}else{
if (c>=128){
o=o+"%"+int2hex(c,2);
}else{
o=o+chr(c);
}
}
}
return o;
}
//调用方法,对URL中各个参数单独urlencode之后再合成
str pa="0.32%";
str pb="中国";
str url;
pa=urlencode(pa);
pb=urlencode(pb);
url="http://shmictrl.com/a.php?pa="+pa+"&pb="+pb;
echo(url); //http://shmictrl.com/a.php?pa=0.32%25&pb=%D6%D0%B9%FA