url-encode-tomcat

自认为对tomcat和浏览器的编码很熟悉了,但是这周遇到了一个自动检测编码的问题。突然发现自己还是那么一知半解了。然后又费点研究一下。

主要讲:

  1. http协议对编码的支持
  2. 浏览器对编码的支持
  3. tomcat 这类web容器对编码的支持

1. http协议

自己感觉 request头主要做的事情是:指示,它传递的信息大多数的泛化的。比方说:告诉server,当前环境支持什么语言,什么编码方式。request中带的信息不多。而response头中信息都是具体的,具体告诉浏览器该做什么,怎么做。

request 头具体指明编码方式的字段是:

Content-Type

但是content-type只有在 Post 和 Put 的时候生效,具体含义是表明当前表单是什么编码类型。

response 头中也有一个 Content-Type,它的含义是当前html的编码是什么。

2. 浏览器编码

浏览器编码分为两部分:

  • url编码
    一般情况下,用户直接在浏览器中输入url编码为utf-8。如果点击页面上的链接,编码方式为当前页面的编码,具体的html代码为,例如:
    1
    <meta http-equiv="Content-Type" content="text/html;charset=gbk">

这样点击url的编码就变成了gbk。

  • html编码
    html编码方式是根据response中返回的Content-Type指定。浏览器根据该值来解码当前的页面。

3. web容器对编码的支持

web容器是根据httpservlet request中的getRequestCoding 来去确定,当前请求的编码。RequestCoding的值只有在Post和Put的时候,浏览器会传递进来。如果是Get请求的话,将不会有值传进来。这时候用什么编码方式呢?是由web容器一个默认配置项指定的。一般情况下,我们会通过spring的一个处理编码的filter来配置。
如果说出现一个请求的url是gb编码,但是你的服务器设置的确是utf-8编码,这时候就会出现乱码问题。一般情况下的处理方式是:

  • 告诉调用我们url的网站我们的编码
  • 动态的检验当前url的编码。(等下继续说如果动态检测url编码)

文档位置:

  1. http协议:http://en.wikipedia.org/wiki/List_of_HTTP_header_fields
  2. 浏览器url编码:http://stackoverflow.com/questions/912811/what-is-the-proper-way-to-url-encode-unicode-characters