2009-10-10 83 views
18

HTTP標準或其他什麼定義了哪些編碼應該在特殊字符上使用,然後在帶有%XXs的url中進行編碼?如果沒有定義,是否有定義使用哪種編碼的方法?看來大多數瀏覽器都是以utf-8發送數據的。什麼是HTTP請求字符串的正確編碼?

回答

25

HTTP標準或其他什麼定義了哪些編碼應該在特殊字符上使用,然後在用%XXs編碼的url中編碼?

HTTP標準號,但另一個標準IRI可以發揮作用。

URI明確地(一旦%編碼)字節序列。這些字節映射到的Unicode字符不是URI標準或HTTP標準的http: - 方案URI指定的。

專門用於查詢參數:網頁瀏覽器將使用原始頁面的編碼進行表單提交GET URL,因此如果您在ISO-8859-1中有頁面,並且您在搜索框中放置了'é' '會得到'?search =%E9',但是如果你在編碼爲UTF-8的頁面中做同樣的事情,你會得到'?search =%C3%E9'。如果您沒有爲瀏覽器猜測的任何特定字符集提供表單頁面,那麼您不會希望這樣做,因爲這將無法猜測提交內容的格式。

對於URL的其他部分,瀏覽器本身不會生成它們,但如果在鏈接中提供非ASCII字符,它通常會將它們編碼爲UTF-8。這是不可靠的,因爲它取決於瀏覽器和區域設置,所以最好暫時不要使用它。

在鏈接中正確允許非ASCII字符的標準是IRI。 IRI通過UTF-8轉換爲URI - % - 編碼大部分URL,但主機名轉換使用Punycode代替。爲了兼容性,最好不要依賴瀏覽器瞭解鏈接中的IRI。相反,UTF-8然後 - % - 自己編碼您的路徑和參數字符。他們仍然會在現代瀏覽器的地址欄中顯示爲正確的字符;不幸的是,IE在所有情況下都不會顯示解碼字符的IRI表單,具體取決於語言設置。

維基IRI爲希臘字符伽瑪是:

http://en.wikipedia.org/wiki/Γ 

編碼成URI,它是:

http://en.wikipedia.org/wiki/%CE%93 
+0

你是從哪裏知道瀏覽器在收到表單的編碼中發送數據的?當我更改內容字符集信息時,我的firefox和chrome似乎確實以這種方式工作。 – JtR 2009-10-11 09:35:45

+0

這只是其中一種行爲,一直被追溯到早期的Netscape。根據規範,提交編碼應該由'accept-charset'控制,並通過多部分形式數據子頭文件傳遞給服務器,但實際上IE得到'accept-charset'是危險錯誤的,並且沒有瀏覽器發送形式數據子文件所以我們堅持這種依賴於表單編碼的情況。噢,有一天每個人都會使用UTF-8,一切都會正常工作。一個世紀...... – bobince 2009-10-11 10:59:08

1

據我所知,沒有辦法定義它,雖然我一直認爲它是ASCII,因爲這是什麼DNS(目前,雖然本地化的DNS即將到來,所有的問題這需要)。

注意:除非您嘗試使用擴展字符,否則UTF8是「ASCII兼容」的。這可能在爲什麼一些瀏覽器可能發送其UTF8編碼的GET數據的原因背後起了一小部分作用。

編輯:從您的評論,似乎你不知道%編碼如何工作,所以在這裏。

鑑於以下字符串查詢字符串"?foo=Hello World!",「Hello World!」部分需要URL編碼。這種方式的工作原理是任何「特殊」字符都會獲取其ASCII值並將其轉換爲前綴爲'%'的十六進制。所以上面的字符串會轉換爲"?foo=Hello%20World%21"

+0

我的意思是在請求參數等特殊字符中的http://富/ page.php文件?name =%12%34foo。 – JtR 2009-10-10 22:16:47

+0

我認爲ISO-8859也是與ascii兼容的情況下,你不使用任何從ascii中丟失的東西。我的firefox至少似乎發送iso-8859-1作爲請求中的默認accept-charset參數。在about:config中更改默認編碼後,它仍然以utf-8發送獲取請求。 – JtR 2009-10-10 22:22:45

+0

'Accept-Charset'隻影響返回的頁面編碼,而不影響請求本身。我在引用GET查詢中的每個字符,而不僅僅是主機名或其他部分。 – 2009-10-10 22:25:27

1

RFC 2616

CHAR   = <any US-ASCII character (octets 0 - 127)> 

token   = 1*<any CHAR except CTLs or separators> 
separators  = "(" | ")" | "<" | ">" | "@" 
        | "," | ";" | ":" | "\" | <"> 
        | "/" | "[" | "]" | "?" | "=" 
        | "{" | "}" | SP | HT 

和URI是token s的各種特定的分隔符。所以,從理論上講,除了US-ASCII之外,任何東西都不應該存在。 (實際上,由於HTTP規範中的許多其他位置都使用了US-ASCII的ISO-8859-1擴展,所以發現支持ISO-8859-1的HTTP實現並不僅僅是US-ASCII,而是嚴格的說這不符合標準的HTTP)。