什么是HTTP请求字符串的正确编码?

问题描述:

HTTP标准或其他什么定义了哪些编码应该在特殊字符上使用,然后在带有%XXs的url中进行编码?如果没有定义,是否有定义使用哪种编码的方法?看来大多数浏览器都是以utf-8发送数据的。什么是HTTP请求字符串的正确编码?

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

据我所知,没有办法定义它,虽然我一直认为它是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

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)。