關于請求主體是否要用encodeURIComponent()來編譯
老師的課很不錯,非常容易懂。不過我之前看《JavaScript權威指南》這本書中的http請求這部分內容時,它說在編輯post請求主體時,要將表單的數(shù)據(jù)編碼,還用到了encodeURIComponent()這樣的方法,好像是要轉化成一種更復雜的字符串。但我看老師做的post請求的請求主體就只是把名值對用‘&’拼在一起,這是怎么回事???哪會前輩回答一下。謝謝。
老師的課很不錯,非常容易懂。不過我之前看《JavaScript權威指南》這本書中的http請求這部分內容時,它說在編輯post請求主體時,要將表單的數(shù)據(jù)編碼,還用到了encodeURIComponent()這樣的方法,好像是要轉化成一種更復雜的字符串。但我看老師做的post請求的請求主體就只是把名值對用‘&’拼在一起,這是怎么回事???哪會前輩回答一下。謝謝。
2015-09-23
舉報
2015-12-23
著作權歸作者所有。
商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處。
作者:黑貓
鏈接:https://www.zhihu.com/question/21861899/answer/43480575
來源:知乎
escape 和 encodeURI 都屬于 Percent-encoding,基本功能都是把 URI 非法字符轉化成合法字符,轉化后形式類似「%*」。它們的根本區(qū)別在于,
escape 在處理 0xff 之外字符的時候,是直接使用字符的 unicode 在前面加上一個 「%u」,而encodeURI則是先進行 UTF-8,再在 UTF-8 的每個字節(jié)碼前加上一個 「%」;
在處理 0xff 以內字符時,編碼方式是一樣的(都是「%XX」,XX為字符的 16 進制 unicode,同時也是字符的 UTF-8),只是范圍(即哪些字符編碼哪些字符不編碼)不一樣。(楊易提醒)
encodeURI 是W3C 的標準,而 Escape 是非標準。
舉一個例子:
知乎的「知」字,可以知道它的 unicode 為 0x77e5,對它進行 UTF-8 編碼,變成了三個字節(jié):0xe7, 0x9f, 0xa5
因此,如果是使用 escape 編碼「知」,得到的結果就是 「%u77E5」;encodeURI 得到的結果則是 「%E7%9F%A5」
Escape 的編碼有一個弊端在于,它后面是 4 位 16 進制,故不支持基本多文種平面(BMP)外的字符(unicode 大于 0xffff)的字符;
而 encodeURI 是基于 UTF-8 的,編碼本身理論上可以支持 0x10ffff 內的字符(實際上現(xiàn)在的 JavaScript 不支持 BMP 外的字符,所以 encodeURI 也不支持 )。
encodeURI 和 encodeURIComponent 的區(qū)別在于需要轉義的字符范圍不一樣,參考 @黃家興 的答案。
使用場景方面,也可以可以參考他的答案,但是不同意這一句:
如果只是編碼字符串,不和URL有半毛錢關系,那么用escape。
encodeURI(Component) ?一般用在 URI 上,但是不是一定就要用在 URL 上。比如如果 POST 請求的 Request Header 中 Content-Type 為「application/x-www-form-urlencoded」, 那么 Request Payload 里面的數(shù)據(jù)一般就是使用 encodeURI(Component) 編碼的。(和 URL 的 querystring 一樣)。