URL查詢字串轉義

url查詢字串中的轉義,眾所周知,url中的轉義是百分號轉義。很多人都只知道一個大概,很少有人能精確說出哪個字元轉義,哪個字元不轉義。這篇文章從新版edge瀏覽器發射的請求,url查詢字串中,字元的轉義情況。

發射的客戶端,查詢字串程式碼為:

`?${char}=${printcode}`

char

是未轉義的字元,

printcode

是整數,表達為十六進位制。例如

感嘆號傳送請求,將會是:

“?!=21”

伺服器端,我們測試ASP。NET的接收情況,其程式碼是:

_logger。LogInformation(“{0}{1}”,    this。Request。QueryString。Value,    stringify(this。Request。Query))

輸出的第一部分是伺服器端接收到請求的escaped字串。第二部分是

Query

解析後的鍵值對。

stringify

是將其序列化的函式,細節忽略。

很明顯,不可列印的非控制字元將會百分號轉義。非ascii字元也會被百分號轉義。我們測試可列印ascii字元(32~127)的轉義情況。

和我們預想的一樣,數字和字母,不轉義:

?0=30[“0”,“30”]。。。?9=39[“9”,“39”]?A=41[“A”,“41”]。。。?Z=5A[“Z”,“5A”]?a=61[“a”,“61”]。。。?z=7A[“z”,“7A”]

其他不轉義的符號有:

?!=21[“!”,“21”]?$=24[“$”,“24”]?(=28[“(”,“28”]?)=29[“)”,“29”]?*=2A[“*”,“2A”]?,=2C[“,”,“2C”]?-=2D[“-”,“2D”]?。=2E[“。”,“2E”]?/=2F[“/”,“2F”]?:=3A[“:”,“3A”]?;=3B[“;”,“3B”]??=3F[“?”,“3F”]?@=40[“@”,“40”]?[=5B[“[”,“5B”]?\=5C[“\\”,“5C”]?]=5D[“]”,“5D”]?^=5E[“^”,“5E”]?_=5F[“_”,“5F”]?`=60[“`”,“60”]?{=7B[“{”,“7B”]?|=7C[“|”,“7C”]?}=7D[“}”,“7D”]?~=7E[“~”,“7E”]

下面這些是字元有特定的用途,瀏覽器不會自動轉義,如表示原義需要手工轉義,避免伺服器解釋錯誤:

?[]//#23:#表示查詢字串的結束,所以查詢字串只有一個問號?%=25[“%”,“25”] //表示百分號編碼的關鍵字?&=26[“”,“26”] //鍵值對的分隔符?+=2B[“ ”,“2B”] //被Query解析為空格?==3D[“”,“=3D”] //鍵與值的分隔符

下面這些是可以自動被瀏覽器百分號轉義的字元:

?%20=20[“ ”,“20”]?%22=22[“\”“,”22“]?%27=27[”‘“,”27“]?%3C=3C[”<“,”3C“]?%3E=3E[”>“,”3E“]?%7F=7F[”\u007F“,”7F“]

後記

URL轉義規則一直在不斷變化,對於新版本升級,我們需要不斷地進行迴歸測試。