摘要:這些字符是普通字符編碼解碼的問題既然瀏覽器會(huì)默認(rèn)給進(jìn)行編碼那么服務(wù)器就會(huì)默認(rèn)給解碼。
URL 編碼 為什么要對(duì) URL 編碼
1. 避免解析錯(cuò)誤
我們的 queryString 的形式是使用 ?開始, key=value 傳遞參數(shù), key-value pairs 之間使用 & 連接.
比如:
?postid=5038412&t=1450591802326
服務(wù)器會(huì)
根據(jù) & 解析 key-value pairs 根據(jù) = 解析 key,value
那么如果 key或者 value 中存在 =,&, 那么就會(huì)解析掛掉,
比如 寶潔公司叫做 P&G
?name=P&G&t=123456
服務(wù)器解析的時(shí)候就會(huì)解析錯(cuò)誤:
name=P G //到這里就掛掉了
2. 避免非法字符
URL 只能使用 ASCII 字符集, 所有的非 ASCII 碼都算是非法字符.
在這個(gè)定義中, 所有的中文都算是非法字符.
一般使用的是 百分號(hào)編碼(percent-encoding)
規(guī)則:
是否是 ASCII 字符 是 取對(duì)應(yīng)的字節(jié)編號(hào), 比如 "a" 對(duì)應(yīng)的是 "0x61", 那么編碼之后就是 %61 否 使用 utf-8 對(duì)其進(jìn)行編碼 比如"中文"使用UTF-8字符集得到的字節(jié)為 0xE4 0xB8 0xAD 0xE6 0x96 0x87, 經(jīng)過Url編碼之后得到"%E4%B8%AD%E6%96%87".實(shí)際情景
瀏覽器會(huì)默認(rèn)給 URL 編碼, 但是不同瀏覽器的編碼實(shí)現(xiàn)方式不一致, 所以最好的方式就是:
我們自己通過 JS 對(duì) URL 進(jìn)行編碼
JS 用來編碼的函數(shù)有 3 個(gè):
// escape() // 不推薦使用, 原因不明. encodeURI() encodeURIComponent()
encodeURI 會(huì)對(duì)整個(gè) URL 中的非法字符編碼 (它是為了解決非法字符)
encodeURIComponent 會(huì)對(duì)所有的保留字都編碼 (解決解析錯(cuò)誤的問題)
所以最終的編碼方式是:
對(duì)每一個(gè) key-value 進(jìn)行 encodeURIComponent 編碼
對(duì)整個(gè) URL 進(jìn)行 encodeURI 編碼
備注:
URL 中的字符可以分成三類:
保留字符 (reserved characters):
這類字符是URI中的保留關(guān)鍵字符,它們用于分割URI中的各個(gè)部分。
這些字符是: ;, /, ?, :, @, &, =, +, $, ,
Mark字符 (mark characters)
這類字符在RFC-2396中特別定義,但是沒有特別說明用途,可能是和別的RFC標(biāo)準(zhǔn)相關(guān)。
這些字符是:-, _, ., !, ~, *, ", (, )
普通字符
URL 編碼解碼的問題
既然瀏覽器會(huì)默認(rèn)給 URL 進(jìn)行編碼, 那么服務(wù)器就會(huì)默認(rèn)給URL 解碼。
如果我們僅僅是對(duì) URL 進(jìn)行 encodeURI, 那么服務(wù)器在解碼的時(shí)候可以正常, 但是解析的時(shí)候依舊不能
區(qū)分 & 到底是分割符還是 value 中的一個(gè)普通字符, 所以我們需要對(duì) key-value pairs 進(jìn)行編碼的.
最終結(jié)論
使用 encodeURIComponent 避免參數(shù)解析錯(cuò)誤
使用 encodeURI 避免非法字符
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/83794.html
摘要:基本概念編碼不能直接使用需要編碼領(lǐng)杉果紅包,享更多優(yōu)惠點(diǎn)擊領(lǐng)取問題的由來就是網(wǎng)址只要上網(wǎng)就一定會(huì)用到只有字母和數(shù)字一些特殊符號(hào)以及某些保留字才可以不經(jīng)過編碼直接用于這意味著如果中有漢字就必須編碼后使用但是麻煩的是沒有規(guī)定具體的編碼方 基本概念 1.encodeComponent編碼url,url不能直接使用,需要編碼 var rlt = http://service.weibo.com...
摘要:當(dāng)然,也可自己寫一個(gè)轉(zhuǎn)換函數(shù),按照一定規(guī)則便行為編碼的字節(jié),如下例中國結(jié)果中國結(jié)果結(jié)果通過簡單的函數(shù),就可以完成編碼到編碼的轉(zhuǎn)換,進(jìn)而完成寬字節(jié)字符到編碼的轉(zhuǎn)換。 前端開發(fā)過程中會(huì)接觸各種各樣的編碼,比較常見的主要是 UTF-8 和 HTML 實(shí)體編碼,但是 web 前端的世界卻不止這兩種編碼,而且編碼的選擇也會(huì)造成一定的問題,如前后端開發(fā)過程中不同編碼的兼容、多字節(jié)編碼可能會(huì)造成的 ...
摘要:在服務(wù)器端,首先通過自動(dòng)進(jìn)行第一次解碼可能是等字符集對(duì)結(jié)果無影響得到字符,然后再使用進(jìn)行第二次解碼,通常使用方法。 第一種方法:var url = encodeURI(url);前端js先編碼一次,后臺(tái):String test=newString(request.getParameter(test).getBytes(iso8859-1),UTF-8); 先解碼還原成byte數(shù)組, 再...
閱讀 3012·2021-11-22 12:06
閱讀 598·2021-09-03 10:29
閱讀 6526·2021-09-02 09:52
閱讀 2013·2019-08-30 15:52
閱讀 3411·2019-08-29 16:39
閱讀 1190·2019-08-29 15:35
閱讀 2061·2019-08-29 15:17
閱讀 1416·2019-08-29 11:17