代码之家  ›  专栏  ›  技术社区  ›  JtR

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

  •  20
  • JtR  · 技术社区  · 16 年前

    HTTP标准或其他标准是否定义了在用%XXs将特殊字符编码到url中之前,应该对其使用哪种编码?如果它没有定义,是否有方法定义使用哪种编码?似乎大多数浏览器都以utf-8格式发送数据。

    3 回复  |  直到 16 年前
        1
  •  26
  •   bobince    16 年前

    HTTP标准或其他标准是否定义了在用%XXs将特殊字符编码到url中之前,应该对其使用哪种编码?

    URI是显式的(经过%解码)字节序列。这些字节映射到的Unicode字符不是由URI标准或HTTP:schema-URI的HTTP标准指定的。

    具体来说,对于查询参数:web浏览器将使用原始页面的编码来生成表单提交GET URL,因此,如果您有ISO-8859-1中的页面,并且您将其放入搜索框中,您会得到什么?search=%E9,但如果你在编码为UTF-8的页面中执行同样的操作,你会得到什么?搜索=%C3%E9。如果你的表单页面没有使用任何特定的字符集,浏览器会猜测,这是你不想要的,因为这将使你无法猜测提交的格式。

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

    正确允许链接中使用非ASCII字符的标准是 IRI Punycode 相反。为了兼容性,最好不要依赖浏览器理解链接中的IRI。相反,您可以自己对路径和参数字符进行UTF-8编码。在现代浏览器中,它们仍将作为正确的字符出现在地址栏中;不幸的是,IE不会在所有情况下显示解码后的字符IRI表单,具体取决于语言设置。

    希腊文gamma字符的Wiki IRI是:

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

    http://en.wikipedia.org/wiki/%CE%93
    
        2
  •  2
  •   Alex Martelli    16 年前

    RFC 2616 ,

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

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

    token

        3
  •  1
  •   Matthew Scharley    16 年前

    编辑:

    "?foo=Hello World!" ,“Hello World!”部分需要URL编码。其工作原理是,任何“特殊”字符都会获取其ASCII值,并转换为前缀为的十六进制 '%' "?foo=Hello%20World%21" .

    推荐文章