淘先锋技术网

首页 1 2 3 4 5 6 7

 

 

在提交表单时,浏览器会根据请求URL生成相应的请求报文给服务器。在这个过程中,浏览器会将请求地址转换为application/x-www-form-urlencoded MIME编码的字符串先,如下图中在这个编码规范中把utf-8的中文字符“陈”转换成“%E9%99%88”

 

application/x-www-form-urlencoded编码规范是:

1.字符‘a’-‘z’、‘A’-‘Z’、‘0’-‘9’不变

2.特殊字符‘.’、‘-’、‘*’、‘_’不变

3.空字符“ ”转成“+”

4.其他字符都视为不安全,都进行转换,每一个byte根据一些规则转换成%xy形式,其中‘xy’是两个16进制数字表示一个byte。

 

以上面例子来解释。“陈”的unicode码是0x9648,二进制表示就是1001 0110 0100 1000,在utf-8的编码方式中需要3个byte来表示:11101001      10011001     10001000。用十六进制表示这三个byte就是E9、99,88。

 

URLEncode,URLDecode就是实现这个规范的编解码类,在看URLEncode源码时卡了两下,一个是String.charAt(i)返回的“陈”的unicode码,不过想想也是char是两byte的,当然不可能返回三个byte的2进制(String内部就是维护一个char数组)。另一个是char Character.forDigit(int digit,int radix)方法,这个方法参数radix是一个>=2 && <=36的值,radix的表示进制,10就是十进制。digit是一个>0 && <radix的数字。这个方法的作用就是在指定进制下一个数字的表达形式,其中超过9的就用小写字母接上。比如Character.forDigit(11,16)就是返回字符‘b’。

还有就是URLEncode的研发这位Herb Jellinek写代码过程用System.out.println()测试可以理解,不过直接把打印代码直接注释就提交有点丑了吧