爲什麼要對 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 字符串

<div u"="" style="color: rgb(123, 125, 98); font-family: verdana, Arial, helvetica, sans-seriff; font-size: 12px; line-height: 18px; white-space: normal; background-color: rgb(255, 255, 255);">

string urlencode ( string $str )

返回字符串,此字符串中除了 -_. 之外的所有非字母數字字符都將被替換成百分號(%)後跟兩位十六進制數,空格則編碼爲加號(+)。此編碼與 WWW 表單 POST 數據的編碼方式是一樣的,同時與 application/x-www-form-urlencoded 的媒體類型編碼方式一樣。由於歷史原因,此編碼在將空格編碼爲加號(+)方面與 RFC1738 編碼(參見rawurlencode())不同。此函數便於將字符串編碼並將其用於 URL 的請求部分,同時它還便於將變量傳遞給下一頁。

標準的英文說明是:

"...Only alphanumerics [0-9a-zA-Z], the special characters "$-_.+!*'()," [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL."

    那哪些字符是需要轉化的呢?

    1. ASCII 的控制字符

    這些字符都是不可打印的,自然需要進行轉化。

    2. 一些非ASCII字符

    這些字符自然是非法的字符範圍。轉化也是理所當然的了。

    3. 一些保留字符

    很明顯最常見的就是“&”了,這個如果出現在url中了,那你認爲是url中的一個字符呢,還是特殊的參數分割用的呢?

    4. 就是一些不安全的字符了。

例如:空格。爲了防止引起歧義,需要被轉化爲“+”。

明白了這些,也就知道了爲什麼需要轉化了,而轉化的規則也是很簡單的。

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

和字符編碼無關

通過urlencode的轉化規則和目的,我們也很容易的看出,urleocode是基於字符編碼的。同樣的一個漢字,不同的編碼類型,肯定對應不同的urleocode的串。gbk編碼的有gbk的encode結果。

apache等服務器,接受到字符串後,可以進行decode,但是還是無法解決編碼的問題。編碼問題,還是需要靠約定或者字符編碼的判斷解決。

因此,urleocode只是爲了url中一些非ascii字符,可以正確無誤的被傳輸,至於使用哪種編碼,就不是eocode所關心和解決的問題了。

編碼問題,不是urlencode所要解決的。

轉自:http://apps.hi.baidu.com/share/detail/32230450



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章