什么是URL編碼? 當瀏覽器訪問www服務(wù)器上的網(wǎng)頁文件時,需要使用HTTP協(xié)議進行通信,在HTTP協(xié)議中,瀏覽器不能向服務(wù)器直接傳遞某些特殊字符,就必須對這些字符進行URL編碼再傳送,其規(guī)則如下:
1.將空格轉(zhuǎn)換成加號(+);
2.對0~9,a~z,A~Z之間的字符保持不變;
3.對于其他的所有字符,用這個字符的當前字符集編碼在內(nèi)存中的十六進制格式表示,并在每個十六進制字節(jié)前加上一個百分號"%",例如,字符"+"用%2B表示,每個只用GB2312編碼的中文字符在內(nèi)存中的占兩個字節(jié),字符"中"用%D6%D0表示.值得注意的是,同一個中文字符在不同的字符集編碼方式下,在內(nèi)存中的編碼值也是不一樣的,一個字符的URL編碼是針對字符在內(nèi)存中的編碼值而言的,采用不同編碼的同一個字符的URL編碼結(jié)果是不一樣的.
在JAVA API中的java.net包中提供了URLEncoder和URLDecoder兩個類,供我們方便實現(xiàn)URL編碼和解碼.下面來看幾個小例子:
1.對于空格也可以直接使用其十六進制編碼方式,即用%20表示,而不是轉(zhuǎn)換成+號,按照上面說的第三條,很顯然%20是可以解碼成空格的.如下兩個URL字符串的效果是一樣的:
http://www.baidu.com/search.html?name=a+b&password=123
http://www.baidu.com/search.html?name=a%20b&password=123
2.如果確信URL串中的特殊字符不會引起歧義,也可以不對它們進行編碼,例如:
http://www.baidu.com/search.html?name=中國&password=123
http://www.baidu.com/search.html?name=%D6%D0%B9%FA&password=123
上面的兩個URL字符串,不管是否對其進行URL編碼,結(jié)果都是一樣的,注意:雖然規(guī)定了除數(shù)字和英文字符不對其URL編碼,但這并不等于必須對其URL編碼,只有在有可能引起歧義或沖突時才是必需的.看下面的例子:
如果要傳遞的name是"中+國",如果不對其進行URL編碼,服務(wù)器就會認為傳過來的是"中 國"."中&國"如果不進行URL編碼就傳給服務(wù)器變成了
http://www.baidu.com/search.html?name=中&國&password=123
我們知道,&這個字符在URL中是有特殊含義的.所以這個查詢字符串的服務(wù)器端就被分成三段來解釋.這樣就不可能達到預(yù)期的結(jié)果.所以對這樣的字符就必須進行URL編碼.