發現如今幾乎全部的網站都對url中的漢字和特殊的字符,進行了urlencode操做, 也就是:apache
http://hi.baidu.com/%BE%B2%D0%C4%C0%CF%C8%CB/creat/blog/安全
這個樣子,中間%形式的,確定就是個人登陸用戶名稱了吧。服務器
爲何對這些字符進行了u的編碼形式,是爲了字符編碼(gbk、utf8)仍是爲了避免出現特殊的字符在url中?都知道要轉,可是轉了的真正好處呢。查看了網上的不少資料,也沒有找到更加準確的說法。app
url轉義其實也只是爲了符合url的規範而已。由於在標準的url規範中中文和不少的字符是不容許出如今url中的。網站
那哪些字符是須要轉化的呢?編碼
ASCII 的控制字符url
這些字符都是不可打印的,天然須要進行轉化。spa
一些非ASCII字符.net
這些字符天然是非法的字符範圍。轉化也是理所固然的了。code
一些保留字符
很明顯最多見的就是「&」了,這個若是出如今url中了,那你認爲是url中的一個字符呢,仍是特殊的參數分割用的呢?
就是一些不安全的字符了。
例如:空格。爲了防止引發歧義,須要被轉化爲「+」。
明白了這些,也就知道了爲何須要轉化了,而轉化的規則也是很簡單的。
按照每一個字符對應的字符編碼,不是符合咱們範圍的,通通的轉化爲%的形式也就是了。天然也是16進制的形式。
和字符編碼無關
經過urlencode的轉化規則和目的,咱們也很容易的看出,urleocode是基於字符編碼的。一樣的一個漢字,不一樣的編碼類型,確定對應不一樣的urleocode的串。gbk編碼的有gbk的encode結果。
apache等服務器,接受到字符串後,能夠進行decode,可是仍是沒法解決編碼的問題。編碼問題,仍是須要靠約定或者字符編碼的判斷解決。
所以,urleocode只是爲了url中一些非ascii字符,能夠正確無誤的被傳輸,至於使用哪一種編碼,就不是eocode所關心和解決的問題了。
詳細http://www.javashuo.com/article/p-hssgmisr-hk.html
URLEncode和URLDecode用於完成普通字符串和 application/x-www-from-urlencoded MIME字符串之間的相互轉化
若是傳遞的字符串中包含非西歐字符的字符串,會被轉化成%XX%XX XX爲十六進制的數字
try { // 將application/x-www-from-urlencoded字符串轉換成普通字符串 String keyWord = URLDecoder.decode("%C4%E3%BA%C3", "GBK"); System.out.println(keyWord); //輸出你好 // 將普通字符創轉換成application/x-www-from-urlencoded字符串 String urlString = URLEncoder.encode("你好", "GBK"); //輸出%C4%E3%BA%C3 System.out.println(urlString); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); }