https://blog.csdn.net/wzd2012/article/details/79077248
*******************************************************************
部分保留字符和不安全字符及其URL編碼 | |||
---|---|---|---|
字符 | 描述 | 用法 | 編碼 |
; | 分號 | 保留 | %3B |
/ | 斜線 | 保留 | %2F |
? | 問號 | 保留 | %3F |
: | 冒號 | 保留 | %3A |
@ | “at”符號 | 保留 | %4O |
= | 等號 | 保留 | %3D |
& | “和”符號 | 保留 | %26 |
< | 小於號 | 不安全 | %3C |
> | 大於號 | 不安全 | %3E |
" | 雙引號 | 不安全 | %22 |
# | 井號 | 不安全 | %23 |
% | 百分號 | 不安全 | %25 |
{ | 左大括號 | 不安全 | %7B |
} | 右大括號 | 不安全 | %7D |
| | 豎線 | 不安全 | %7C |
\ | 反斜線 | 不安全 | %5C |
^ | 加字號 | 不安全 | %5E |
~ | 波浪 | 不安全 | %7E |
[ | 左中括號 | 不安全 | %5B |
] | 右中括號 | 不安全 | %5D |
` | 反單引號 | 不安全 | %60 |
空格 | 不安全 | %20 |
URL編碼在ASCII表中的體現
如何編碼?
眾所周知,字符是可由八位字節數(octet)來表示的,八位字節數可用十六進制來表示它的值。如字符“<”的八位字節數十六進制值是3C。在URL中,字符的編碼方式為:“%”加上字符的兩個十六進制數值。舉幾個例子:
- “<”可以被編碼為%3C,空格“SP”可被編碼為“%20”
- “田”的GB2312編碼十六進制值是CC EF,這時“田”的URL編碼為%CC%EF
- “囧”的GBK編碼十六進制值是87 E5,這時“囧”的URL編碼為%87%E5
- “田”的UTF-8編碼十六進制值是E7 94 B0,這時“田”的URL編碼為%E7%94%B0
URL中包含漢字時的更多話題
RFC1738沒有規定漢字的編碼方式,而是讓瀏覽器自己去決定,因此造成了URL漢字編碼的不統一。經過研究,對於URL中的“查詢字符串”和“路徑”中包含漢字,不同瀏覽器有不同的處理。
1. 查詢字符串中包含漢字
在網址輸入:http://www.baidu.com/s?wd=田囧 ,敲擊回車,使用Fiddler觀察瀏覽器發出的請求(以IE8和Firefox為例):
查詢字符串中含有中文
IE8將漢字作為GBK編碼,直接發往服務器(這其實是不符合RFC規范的);Firefox則多了一次加%的操作。Windows操作系統是GBK編碼。得到結論,地址欄直接訪問URL,漢字作為查詢字符串(Query string)時,IE和Firefox會使用系統編碼發至服務器端,Firefox會按規矩編碼。
注意1:不要用Google進行測試,Google的搜索URL(類似:http://www.google.com/#hl=en&source=hp&q=田囧 ),搜索關鍵詞那里不是查詢字符串,因為前面有個#……我開始沒注意到,被搞迷茫了很久……
注意2:這只是對URL直接訪問的規律。如果頁面時從鏈接點擊打開的,例如從A頁面含中文的鏈接打開了B頁面,那么瀏覽器對中文的編碼取決於A頁面的編碼。
2. URL路徑中包含漢字
在網址直接輸入:http://www.hudong.com/wiki/田囧 ,敲擊回車,觀察請求
路徑中含有中文
IE8和Firefox都把漢字作為UTF8,按規范進行了URL編碼,還好。