在URI的規範中定義了一些保留字元(Reserved character),如下表所示
保留字
|
%HEXHEX
|
空白
|
%20
|
%21
| |
#
|
%23
|
$
|
%24
|
&
|
%26
|
‘
|
%27
|
(
|
%28
|
)
|
%29
|
*
|
%2A
|
+
|
%2B
|
%2C
| |
/
|
%2F
|
:
|
%3A
|
;
|
%3B
|
=
|
%3D
|
?
|
%3F
|
@
|
%40
|
[
|
%5B
|
]
|
%5D
|
上表保留字在URI中都有它的作用,如果你要在請求參數上表達URI中的保留字元,必須在%字
元之後以十六進位數值表示方式,來表示該字元的八個位元數值。如果URL中使用到了這些保
留字,就必須將它編碼為「%HEXHEX」(HEX表示1個16進位值,HEXHEX表示有二個16進位
值)的形式,舉例來說,「空白字元」的 ASCII code 是32 (16進制為20),所以會被編碼
為 %20,而其它 non-ASCII 字元(如:中文字)則以 UTF-8 字元編碼後的位元組來編碼成
%HEXHEX 的形式。
空白與加號( + ) 。
今天你如果參數內容為 123 + 45 + 6 ,沒有經過編碼直接post到Server,Server收到的會是
123 45 6 ,Server端預設自動把+ 號轉成空白。
今天你如果參數內容為 123 + 45 + 6 ,沒有經過編碼直接post到Server,Server收到的會是
123 45 6 ,Server端預設自動把+ 號轉成空白。
也就是說,其實你在以post傳遞參數時,Server看到+ 就 誤會 你輸入的是空白,是client端
程式(ex . chrome , FireFox , IE)幫你把空白轉換成+再送到Server的(其實我本來
就打+,跳到愛河也洗不清了 ) ,所以你真的要打+ 怎麼辦。可以選擇手動把原本要打+的地
方轉換成%2B或是用程式做轉換。
(以C#為例)
string text = HttpUtility.UrlEncode(text,encoding);
text為欲轉換的參數字串。不要用錯,
它還有一個
string text = HttpUtility.HtmlEncode(text, encoding);
string text = HttpUtility.HtmlEncode(text, encoding);
這二個容易搞混, 用的時間點如下說明
將 HTML 文件中不允許出現的字元進行編碼,通常會編碼 "<"、">"、"&" 等字元。
URL 編碼方式會將 URL 中不允許的字元轉換為相等的字元實體,例如+ 、= 、: 、? 等字元。
參考資料
http://openhome.cc/Gossip/Encoding/URLEncoding.html
http://zh.wikipedia.org/wiki/%E7%99%BE%E5%88%86%E5%8F%B7%E7%BC%96%E7%A0%81
沒有留言:
張貼留言