1. 程式人生 > >為什麼要對URL進行encode

為什麼要對URL進行encode

發現現在幾乎所有的網站都對url中的漢字和特殊的字元,進行了urlencode操作,也就是:http://hi.baidu.com/%BE%B2%D0%C4%C0%CF%C8%CB/creat/blog/
這個樣子,中間%形式的,肯定就是我的登入使用者名稱稱了吧。

為什麼對這些字元進行了u的編碼形式,是為了字元編碼(gbk、utf8)還是為了不出現特殊的字元在url中?都知道要轉,但是轉了的真正好處呢。查看了網上的很多資料,也沒有找到更加準確的說法。

url轉義其實也只是為了符合url的規範而已。因為在標準的url規範中中文和很多的字元是不允許出現在url中的。
看一下php的urlencode的說明:
urlencode — 編碼 URL 字串


string urlencode ( string $str )
返回字串,此字串中除了 -_. 之外的所有非字母數字字元都將被替換成百分號(%)後跟兩位十六進位制數,空格則編碼為加號(+)。此編碼與 WWW 表單 POST 資料的編碼方式是一樣的,同時與 application/x-www-form-urlencoded 的媒體型別編碼方式一樣。由於歷史原因,此編碼在將空格編碼為加號(+)方面與 RFC1738 編碼(參見 rawurlencode())不同。此函式便於將字串編碼並將其用於 URL 的請求部分,同時它還便於將變數傳遞給下一頁。
哪些字元是需要轉化的呢?
1. ASCII 的控制字元

這些字元都是不可列印的,自然需要進行轉化。
2. 一些非ASCII字元
這些字元自然是非法的字元範圍。轉化也是理所當然的了。
3. 一些保留字元
很明顯最常見的就是“&”了,這個如果出現在url中了,那你認為是url中的一個字元呢,還是特殊的引數分割用的呢?
4. 就是一些不安全的字元了。
例如:空格。為了防止引起歧義,需要被轉化為“+”。
明白了這些,也就知道了為什麼需要轉化了,而轉化的規則也是很簡單的。

按照每個字元對應的字元編碼,不是符合我們範圍的,統統的轉化為%的形式也就是了。自然也是16進位制的形式。

和字元編碼無關
通過urlencode的轉化規則和目的,我們也很容易的看出,urleocode是基於字元編碼的。同樣的一個漢字,不同的編碼型別,肯定對應不同的urleocode的串。gbk編碼的有gbk的encode結果。
apache等伺服器,接受到字串後,可以進行decode,但是還是無法解決編碼的問題。編碼問題,還是需要靠約定或者字元編碼的判斷解決。
因此,urleocode只是為了url中一些非ascii字元,可以正確無誤的被傳輸,至於使用哪種編碼,就不是encode所關心和解決的問題了。
編碼問題,不是urlencode所要解決的。