【发布时间】:2009-10-10 22:09:17
【问题描述】:
HTTP 标准或其他东西是否定义了特殊字符在使用 %XXs 在 url 中编码之前应该使用哪种编码?如果它没有定义,有没有办法定义使用哪种编码?似乎大多数浏览器都以 utf-8 格式发送数据。
【问题讨论】:
HTTP 标准或其他东西是否定义了特殊字符在使用 %XXs 在 url 中编码之前应该使用哪种编码?如果它没有定义,有没有办法定义使用哪种编码?似乎大多数浏览器都以 utf-8 格式发送数据。
【问题讨论】:
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
【讨论】:
accept-charset 控制并在多部分表单数据子标题中与服务器通信,但实际上IE 得到accept-charset 危险错误并且没有浏览器发送表单数据子标题,所以我们被这种依赖表单编码的情况困住了。哦,好吧,有一天每个人都会使用 UTF-8,一切都会正常工作。一个世纪...
每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)。
【讨论】:
据我所知,没有办法定义它,尽管我一直认为它是 ASCII,因为这就是 DNS(目前,虽然本地化 DNS 即将到来,但所有问题需要)。
注意:除非您尝试使用扩展字符,否则 UTF8 是“ASCII 兼容的”。这可能在某些浏览器可能以 UTF8 编码发送其 GET 数据的原因中发挥了很小的作用。
编辑:从您的评论看来,您似乎根本不知道 % 编码是如何工作的,所以就这样吧。
给定以下字符串查询字符串"?foo=Hello World!",即“Hello World!”部分需要 URL 编码。其工作方式是任何“特殊”字符获取它们的 ASCII 值并转换为以'%' 为前缀的十六进制。所以上面的字符串会转换成"?foo=Hello%20World%21"。
【讨论】:
Accept-Charset 只影响返回的页面编码,而不影响请求本身的编码。我指的是 GET 查询中的每个字符,而不仅仅是主机名或其他部分。