Web 服务器如何知道发布给它们的表单中使用的字符集?
当 Web 服务器获取表单的 POST 时,将其解析为参数值对非常简单。但是,如果这些值包含浏览器编码的非英语字符,则浏览器必须知道所使用的字符集才能对其进行解码。
我检查了两个帖子发送的请求。一种是从使用 UTF-8 的页面完成的,另一种是从使用 Windows-1255 的页面完成的。相同的文本有不同的编码。 AFAIK,Content-type 标头可以在 application/x-www-form-urlencoded
之后包含一个字符集,但事实并非如此(使用 Firefox)。
在 servlet 中,当您使用 request.getParameter()
时,您应该获得解码后的值。 servlet 容器是如何做到这一点的?它是否总是押注于 UTF-8,使用一些启发式方法,还是我缺少某种确定性的方法?
When a web server gets a POST of a form, parsing it into param-value(s) pairs is quite straightforward. However, if the values contain non-English chars that have been encoded by the browser, it must know the charset used in order to decode them.
I've examined the requests sent by two posts. One was done from a page using UTF-8, and one from a page using Windows-1255. The same text was encoded differently. AFAIK, the Content-type header could contain a charset after the application/x-www-form-urlencoded
, but it wasn't (using Firefox).
In a servlet, when you use request.getParameter()
, you're supposed to get the decoded value. How does the servlet container do that? Does it always bet on UTF-8, use some heuristics, or is there some deterministic way I'm missing?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
来自 Serlvet 3.0 规范,第 3.10 节请求数据编码(重点是我的)
在实践中,我发现在响应中设置字符集会影响后续 POST 中使用的字符集。为了更加确定,您可以编写一个调用 setCharacterEncoding 在每个请求对象使用之前。
您可能还会发现此线程很有用 - 检测HTTP POST 请求
From the Serlvet 3.0 Spec, section 3.10 Request Data Encoding (emphasis mine)
In practice, I find that setting the charset in a response influences the charset used in the subsequent POST. To be extra sure, you can write a Servlet Filter that calls the setCharacterEncoding on every request object before it is used.
You may also find this thread useful - Detecting the character encoding of an HTTP POST request
用于指定字符集的适当标头是Accept-Charset。
最新的 Linux 版 Chrome,例如,吐槽:
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
每个请求的
。 http://www.w3.org/Protocols/rfc2616/rfc2616-第 14.2 节sec14.html 指出:
因此,如果您从客户端收到这样的标头,则
q
最高的值可能是您从其接收的编码。The apropriate header for specifying charsets is
Accept-Charset
.Latest Chrome for linux, e.g., spits:
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
on each request.
Section 14.2 from http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html states:
So if you receive such a header from a client, the value with highest
q
can be the encoding you're receiving from it.