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

时间:2009-10-10 22:09:17

标签: http encoding

在使用%XXs在网址中编码特殊字符之前,HTTP标准或其他内容是否定义应使用哪种编码?如果没有定义是否有定义使用哪种编码的方法?似乎大多数浏览器都以utf-8发送数据。

3 个答案:

答案 0 :(得分:26)

  

HTTP标准或某些内容是否定义了在使用%XXs在网址中编码特殊字符时应使用哪种编码?

HTTP标准,没有。但另一个标准IRI可以发挥作用。

URI是显式的(一旦%解码)字节序列。这些字节映射到的Unicode字符未由URI标准或http:-scheme URI的HTTP标准指定。

特别是对于查询参数:Web浏览器将使用原始页面的编码来生成表单提交GET URL,因此如果您有一个ISO-8859-1中的页面,并且您将'é'放在搜索框中'' ll得到'?search =%E9',但是如果你在编码为UTF-8的页面中做同样的事情你会得到'?search =%C3%E9'。如果您没有为任何特定字符集提供表单页面,浏览器会猜测,这是您不想要的,因为它将无法猜测提交内容将以何种格式出现。

对于URL的其他部分,浏览器本身不会生成它们,但如果在链接中为其提供非ASCII字符,它通常会将它们编码为UTF-8。这不可靠,因为它取决于浏览器和区域设置,所以最好不要在目前使用它。

正确允许链接中非ASCII字符的标准是IRI。 IRI通过UTF-8转换为URI - % - 编码大部分URL,但主机名使用Punycode转换。为了兼容性,最好不要依赖浏览器了解链接中的IRI。相反,UTF-8-then - % - 自己编码路径和参数字符。它们仍将在现代浏览器的地址栏中显示为正确的字符;遗憾的是,IE不会在所有情况下都显示解码字符IRI表单,具体取决于语言设置。

希腊伽玛角色的Wiki IRI是:

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

编码到URI中,它是:

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

答案 1 :(得分:1)

据我所知,没有办法定义它,虽然我一直认为它是ASCII,因为这就是DNS(目前,虽然本地化的DNS即将到来,所有的问题都是需要)。

注意:除非您尝试使用扩展字符,否则UTF8是“ASCII兼容的”。这可能在一些浏览器为什么会发送他们的GET数据UTF8编码背后的原因中扮演了一小部分。

编辑:根据您的评论,您似乎根本不知道%编码是如何工作的,所以就这样了。

给定以下字符串查询字符串"?foo=Hello World!",“Hello World!”部分需要URL编码。它的工作方式是任何“特殊”字符获取其ASCII值并转换为前缀为'%'的十六进制。因此,上述字符串将转换为"?foo=Hello%20World%21"

答案 2 :(得分:1)

RFC 2616

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

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

和URI是token个,带有各种特定的分隔符。因此,从理论上讲,只有US-ASCII应该存在。 (实际上,由于US-ASCII的ISO-8859-1扩展用于HTTP规范中的许多其他位置,因此找到支持ISO-8859-1而不仅仅是US-ASCII的HTTP实现并不罕见,但严格来说说这不符合标准的HTTP)。