2009-07-31 71 views
94

在一個網址,我應該用編碼或%20+空間?例如,在下面的例子中,哪一個是正確的?在URL中,空格應該使用%20還是+來編碼?

www.mydomain.com?type=xbox%20360 
www.mydomain.com?type=xbox+360 

我公司是偏向於前者,但使用Java方法URLEncoder.encode(String, String)"xbox 360"(和"UTF-8"returns the latter

那麼,有什麼區別?

+4

爲.NET開發人員的利益有%20?+前:HttpUtility.UrlPathEncode使用「% 20'HttpUtility.UrlEncode使用'+'。來源:http://msdn.microsoft.com/en-us/library/system.web.httputility.urlpathencode(v=vs.110).aspx – CodeToad 2014-09-01 11:03:26

+3

@MetaByter我認爲在技術上更正確的短語的問題是「在URL中,我應該使用%20或+ *在URL的查詢部分中編碼空格*嗎?因爲雖然你展示的例子只在查詢部分包含空格,但對於所有讀者來說,答案依賴的可能並不清楚。或者,你可以提出這樣的問題:「在*下面的具體URL示例*中,我應該編碼...」 – Matt 2015-05-31 01:06:47

回答

5

不應該問題,如果您將字母A編碼爲%41,則更多。

但是,如果你處理不承認一種形式的系統,它好像你只是將不得不給它什麼,它預計,無論什麼「規範」說。

87

表格數據(GET或POST)通常被編碼爲application/x-www-form-urlencoded:此指定+空格。

URL被編碼爲RFC 1738指定%20

從理論上講,我認爲你的?和+前後應該有%20:

example.com/foo%20bar?foo+bar 
+9

除了在電子郵件鏈接中,因爲在+將會導致郵件以+ es打開。因此: `mailto:[email protected]?subject = I%20need%20help` – Sygmoral 2015-02-19 00:33:01

43

按照W3C(他們對這些事物的官方消息),在查詢字符串中的空格字符(僅在查詢字符串中)可被編碼爲「%20」或「+」。從「建議」下的「查詢字符串」部分:

在查詢字符串中,加號被保留爲空格的簡寫符號。因此,真正的加號必須被編碼。此方法用於使查詢URI更容易在不允許空格的系統中傳遞。

RFC2396這是對一般的URI的正式規範第3.4節,「查詢」組分是URL依賴性:

3.4。查詢組件 查詢組件是一個信息串, 資源進行解釋。

query   = *uric 

在一個查詢組件,字符 「;」, 「/」, 「?」 「:」, 「@」, 「&」, 「=」, 「+」, 「」和「$」保留。

因此,如果它不接受查詢字符串中帶有空格的URL編碼爲「+」字符,則表示其他軟件存在錯誤。

至於你的問題的第三部分,修復URLEncoder.encode()輸出的一種方法(雖然稍微難看),然後callreplaceAll("\\+","%20")上的返回值。

+0

而不是使用編碼到application/x-www-form-urlencoded的URLEncoder,使用java.net.URI,它編碼爲true百分比編碼。 – 2014-03-25 18:04:11

5

您可以使用 - 這意味着大多數人選擇「+」,因爲它更可讀。

0

編碼查詢值時,無論是form,plus還是percent-20,都是有效的;然而,由於互聯網的帶寬並不是無限的,所以你應該使用plus,因爲它少了兩個字節。

7

這種混亂是因爲URL仍然是「破」的這一天

採取「http://www.google.com」的實例。這是一個URL。 URL 是一個統一資源定位符,並且實際上是指向網頁 (大多數情況下)的指針。網址其實有一個非常明確的結構 自1994年

第一規格我們可以提取有關「http://www.google.com」 URL的詳細信息:

+---------------+-------------------+ 
|  Part  |  Data   | 
+---------------+-------------------+ 
| Scheme  | http    | 
| Host address | www.google.com | 
+---------------+-------------------+ 

如果我們看一下更多 複雜的URL如 「https://bob:[email protected]:8080/file;p=1?q=2#third」我們可以 提取以下信息:

+-------------------+---------------------+ 
|  Part  |  Data   | 
+-------------------+---------------------+ 
| Scheme   | https    | 
| User    | bob     | 
| Password   | bobby    | 
| Host address  | www.lunatech.com | 
| Port    | 8080    | 
| Path    | /file    | 
| Path parameters | p=1     | 
| Query parameters | q=2     | 
| Fragment   | third    | 
+-------------------+---------------------+ 

保留的字符是對於每個部分

不同對於HTTP的URL,在一個路徑片段一部分的空間具有將待編碼 「%20」(未,絕對不是「+」) ,而路徑 片段部分中的「+」字符可以保留未編碼。

現在在查詢部分,空格可能被編碼爲「+」(對於 向後兼容性:不要試圖在URI中標準搜索它)或「%20」,而「+」字符由於這種模糊不清)必須轉義爲「%2B」。

這意味着「藍色+淺藍色」串必須被在路徑和查詢部件不同編碼 : 「http://example.com/blue+light%20blue?blue%2Blight+blue」。從 可以推斷出,對URL結構沒有語法意識的情況下,編碼完全構建的URL不可能是 。

這是什麼歸結爲是

你應該後

Source

相關問題