JS 中 URL 編碼的問題

2021-09-16 20:11:47 字數 1822 閱讀 1452

1. 避免解析錯誤

我們的 querystring 的形式是使用 ?開始, key=value 傳遞引數, key-value pairs 之間使用 & 連線.

比如:

?postid=5038412&t=1450591802326
伺服器會

根據 & 解析 key-value pairs

根據 = 解析 key,value

那麼如果 key或者 value 中存在 =,&, 那麼就會解析掛掉,

比如 寶潔公司叫做 p&g

?name=p&g&t=123456
伺服器解析的時候就會解析錯誤:

name=p

g //到這裡就掛掉了

2. 避免非法字元

url 只能使用 ascii 字符集, 所有的非 ascii 碼都算是非法字元.

在這個定義中, 所有的中文都算是非法字元.

一般使用的是 百分號編碼(percent-encoding)

規則:

是否是 ascii 字元

是取對應的位元組編號, 比如 'a' 對應的是 '0x61', 那麼編碼之後就是 %61

否使用 utf-8 對其進行編碼

比如"中文"使用utf-8字符集得到的位元組為 0xe4 0xb8 0xad 0xe6 0x96 0x87,

經過url編碼之後得到"%e4%b8%ad%e6%96%87".

瀏覽器會預設給 url 編碼, 但是不同瀏覽器的編碼實現方式不一致, 所以最好的方式就是:

我們自己通過 js 對 url 進行編碼

js 用來編碼的函式有 3 個:

// escape()  // 不推薦使用, 原因不明.

encodeuri()

encodeuricomponent()

encodeuri 會對整個 url 中的非法字元編碼 (它是為了解決非法字元)

encodeuricomponent 會對所有的保留字都編碼 (解決解析錯誤的問題)

所以最終的編碼方式是:

對每乙個 key-value 進行 encodeuricomponent 編碼

對整個 url 進行 encodeuri 編碼

備註:url 中的字元可以分成三類:

保留字元 (reserved characters):

這類字元是uri中的保留關鍵字元,它們用於分割uri中的各個部分。

這些字元是: ;, /, ?, :, @, &, =, +, $, ,

mark字元 (mark characters)

這類字元在rfc-2396中特別定義,但是沒有特別說明用途,可能是和別的rfc標準相關。

這些字元是:-, _, ., !, ~, *, ', (, )

普通字元

url 編碼解碼的問題

既然瀏覽器會預設給 url 進行編碼, 那麼伺服器就會預設給url 解碼。

如果我們僅僅是對 url 進行 encodeuri, 那麼伺服器在解碼的時候可以正常, 但是解析的時候依舊不能

區分 & 到底是分割符還是 value 中的乙個普通字元, 所以我們需要對 key-value pairs 進行編碼的.

最終結論

使用 encodeuricomponent 避免引數解析錯誤

使用 encodeuri 避免非法字元

js中的url編碼

看下邊這個url串 1 back 在go頁面用c 的request.querystring肯定無法獲取正確的back引數.back的引數值會是 而js呼叫go頁面時就需要對back引數裡的url串進行url編碼才行.escape 方法 採用iso latin字符集對指定的字串停止編碼。所有的空格符 ...

js中的url編碼

看下邊這個url串 1 back 在go頁面用c 的request.querystring肯定無法獲取正確的back引數.back的引數值會是 而js呼叫go頁面時就需要對back引數裡的url串進行url編碼才行.escape 方法 採用iso latin字符集對指定的字串停止編碼。所有的空格符 ...

URL中的編碼問題

文章 自 路徑編碼採用utf 8 查詢字串編碼和作業系統編碼一致 get和post方法用的是網頁的編碼 ajax呼叫的url包含漢字,ie採用gb2312 作業系統的預設編碼,gbk相容gb2312 firefox和google採用utf 8 對於以上統一處理的辦法就是在js中對url編碼,可以用e...