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