為什么要對URL進行編碼?
一般來說,網頁URL只能使用英文、數字、還有一些特定的字符。根據網絡標准RFC 1738做了硬性規定:
只有字母和數字[0-9a-zA-Z]、一些特殊符號"$-_.+!*'(),"[不包括雙引號]、以及某些保留字,才可以不經過編碼直接用於URL。
所以若URL中包括中文等字符,就必須經過編碼后使用,否則傳給服務器的request URL就會包含亂碼,服務器無法正確識別。
因為RFC 1738沒有規定具體的編碼方法,而是交給應用程序(瀏覽器)自己決定,所以導致“URL編碼”領域非常混亂。想要了解瀏覽器多種情況下的編碼處理,可以參考阮一峰大神的關於URL編碼。
URL的編碼與解碼方法
不同的操作系統、不同的瀏覽器、不同的網頁字符集,將導致完全不同的編碼結果,為了保證客戶端只用一種編碼方法向服務器發出請求,可以使用Javascript先對URL編碼,然后再向服務器提交,不要給瀏覽器插手的機會。
編碼方法有三種:
escape(url)、encodeURL(url)、encodeURLComponent(url) (url為需要編碼的URL)
方法 | 規則 | 特點 |
escape(編碼) unescape(解碼) |
除了ASCII字母、數字、標點符號"@ * _ + - . /"以外,對其他所有字符進行編碼 | 現在已經不提倡使用這種方法了,它不能直接運用與URL編碼,它的真正作用是返回一個字符的Unicode編碼值 |
encodeURI(編碼) decodeURI(解碼) |
除了常見的符號以外,對其他一些在網址中有特殊含義的符號"; / ? : @ & = + $ , #",也不進行編碼 | encodeURI()是Javascript中真正用來對URL編碼的函數,它着眼於對整個URL進行編碼 |
encodeURIComponent(編碼) decodeURIComponent解碼) |
在encodeURI()中不被編碼的符號"; / ? : @ & = + $ , #",在encodeURIComponent()中統統會被編碼 | 與encodeURI()的區別是,它用於對URL的組成部分進行個別編碼,而不用於對整個URL進行編碼 |
舉個栗子:
用后兩種常用編碼方法對該URL:http://www.w3school.com.cn/my first:class/ 進行編碼:
- encodeURI: encodeURI('http://www.w3school.com.cn/my first:class/') -> http://www.w3school.com.cn/my%20first:class/
- encodeURIComponent: encodeURIComponent('http://www.w3school.com.cn/my first:class/') -> http%3A%2F%2Fwww.w3school.com.cn%2Fmy%20first%3Aclass%2F