對於警報,您自己正在編碼。如果你刪除了encodeURIComponent
,它看起來可能與服務器端相同。
在服務器端,ASP.NET將始終向您顯示未編碼的表單。這樣可以更容易地直接映射到還需要進行(未)編碼的文本的文件。
請注意,您可以在URL編碼中替換每個字母的UTF8表示形式。它仍然是相同的網址。即,在瀏覽器窗口中鍵入以下內容,它仍然可以工作:%66%59%6E%64.aspx?location=Seattle%2C%20WA
。要僅編碼必需的字符,如果您自己創建鏈接,請在服務器端使用UrlEncode。
URL編碼可能變得相當棘手。你要求解釋它。要知道某個角色的正確轉義,您需要知道該角色在UTF8中的外觀。 UTF-8字節的十六進制值將成爲你的字母的%XX%YY值。有時它只有一個%XX,但總共可以達到六個字節的序列(例如一些中文字符)。
URL編碼僅適用於一種方式。切勿重複編碼或雙重解碼。這是規範所禁止的。此外,由於您可以對任何字符進行編碼,因此並不總是可以(如您發現的那樣)執行往返編碼/解碼。如果您未重新編碼並重新編碼,結果字符串可能不同,但語法上相同。
在HTML中,URL Encoding is sometimes interspersed with HTML Encoding。即,&符號在HTML中有效,但不在HTML中。 find.aspx?city=A&name=B
變成find.aspx?city=A&name=B
和HTML網址。但是,瀏覽器是寬鬆的,並會錯誤地接受HTML編碼的字符串。
最後,不在瀏覽器上:如果您在鏈接中鍵入空格,即使在標籤內部,也會爲您跳過空格(或其他字符)。同樣,它現在將在地址欄中顯示奇數字符(é,ï等),但當它通過HTTP發送時,瀏覽器將正確地爲您執行編碼。
更新:約anwering你需要一個 「明確的」 參考或證明的問題。
雖然我在網上找不到任何東西,但我決定自己使用Reflector來尋找它。通過設置的方法,例如,HttpRequest.QueryString
,您很快會遇到私有方法HttpRequest.FillInQueryStringCollection
,然後調用HttpValueCollection.FillfromEncodedBytes
。有點接近該方法的結尾,HttpUtility.UrlDecode
被稱爲值。結論:不要自己調用它,以防止雙重解碼。
當您下載Reflector並反彙編System.Web的.NET庫時,您可以親自看到它。
@M Katz:關於你的另一個問題,在一些評論中提到,有關「證明」的參考資料,請參閱我的更新。 (此評論不會保留) – Abel 2010-01-22 12:47:35