【问题标题】:What's the correct encoding of HTTP get request strings?HTTP 获取请求字符串的正确编码是什么?
【发布时间】:2009-10-10 22:09:17
【问题描述】:

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

【问题讨论】:

    标签: http encoding


    【解决方案1】:

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

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

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

    专门针对查询参数:网络浏览器将使用原始页面的编码来提交表单 GET URL,因此如果您有一个 ISO-8859-1 页面并且您在搜索框中输入了“é”会得到 '?search=%E9',但如果你在编码为 UTF-8 的页面中做同样的事情,你会得到 '?search=%C3%E9'。如果您不使用任何特定字符集提供表单页面,浏览器会猜测,这是您不想要的,因为它会让人无法猜测提交将采用什么格式。

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

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

    希腊 gamma 字符的 Wiki IRI 是:

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

    编码成URI,就是:

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

    【讨论】:

    • 您在哪里发现浏览器以它收到表单的编码发送数据?当我更改内容字符集信息时,我的 firefox 和 chrome 似乎真的可以这样工作。
    • 这只是早期 Netscape 一直遵循的行为之一。根据规范,提交编码应由accept-charset 控制并在多部分表单数据子标题中与服务器通信,但实际上IE 得到accept-charset 危险错误并且没有浏览器发送表单数据子标题,所以我们被这种依赖表单编码的情况困住了。哦,好吧,有一天每个人都会使用 UTF-8,一切都会正常工作。一个世纪...
    【解决方案2】:

    RFC 2616

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

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

    和 URI 是带有各种特定分隔符的 tokens。所以,理论上,除了 US-ASCII 之外什么都没有。 (实际上,由于 US-ASCII 的 ISO-8859-1 扩展在 HTTP 规范中的许多其他地方使用,因此找到支持 ISO-8859-1 而不仅仅是 US-ASCII 的 HTTP 实现并不罕见,但严格来说说这不是符合标准的 HTTP)。

    【讨论】:

      【解决方案3】:

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

      注意:除非您尝试使用扩展字符,否则 UTF8 是“ASCII 兼容的”。这可能在某些浏览器可能以 UTF8 编码发送其 GET 数据的原因中发挥了很小的作用。

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

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

      【讨论】:

      • 我的意思是请求参数中的特殊字符,例如foo/page.php?name=%12%34foo
      • 我认为 ISO-8859 也与 ascii 兼容,以防您不使用 ascii 中缺少的任何内容。我的 Firefox 至少似乎将 iso-8859-1 作为请求中的默认接受字符集参数发送。更改 about:config 中的默认编码后,它仍然以 utf-8 格式发送 get 请求。
      • Accept-Charset 只影响返回的页面编码,而不影响请求本身的编码。我指的是 GET 查询中的每个字符,而不仅仅是主机名或其他部分。
      • 你是怎么得出我不知道 URI 转义是如何工作的结论的?
      猜你喜欢
      • 2018-02-24
      • 2016-07-07
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      相关资源
      最近更新 更多