编码问题

1、请求编码

1.1 直接在浏览器中输入请求地址

这类请求中,请求数据是由客户端浏览器发送给服务器的,请求数据的编码是由浏览器决定的。不同浏览器所使用的编码不一样,所以这是不确定的。
  • IE:使用GB2312
  • FireFox:使用GB2312
  • Chrome:使用UTF-8

1.2 在页面中发出请求

通常向服务器发送请求数据都需要先向服务器请求一个页面,页面中有超链接和表单,通过超链接和表单就可以向服务器发送请求数据了。
因为页面是服务器发送给客户端的,所以页面本身的编码由服务器决定,用户在页面中输入的数据也是由页面本身的编码决定的。
<meta http-equiv="content-type" content="text/html; charset=UTF-8">,相当于给客户端发送了一个content-type请求头,指定当前页面为UTF-8。

1.3 GET请求解读编码

当客户端通过GET请求向服务器发送数据时,使用request.getParameter()获取的数据被服务器误认为是ISO-8859-1编码的,也就是说,客户端发送过来的数据无论是通过UTF-8还是GBK编码的,服务器都通过ISO-8859-1来解码。所以,我们获取到数据后需要通过ISO-8859-1编码,再用正确的编码格式进行解码,假设服务器发送的数据是通过UTF-8编码的,我们要获取请求参数name的值,如下:
String name = request.getParameter("name");
name = new String(name.getBytes("ISO-8859-1"),"UTF-8");

1.4 POST请求解读编码

当客户端通过POST请求向服务器发送数据时,使用request.getParater()获取请求数据,默认情况下,服务器还是通过ISO-8859-1来解码,但我们通过request.getParameter()获取请求数据之前可以通过request.setCharacterEncoding("UTF-8")来指定编码,然后再使用request.getParameter()来获取请求参数,那么服务器就是通过指定编码来解码了。例如:
request.setCharacterEncoding("UTF-8")
String name = request.getParameter("name");

2、响应编码

响应:服务器发给客户端的数据。响应是由response来完成的,如果响应的数据不是字符数据,那么无需考虑编码问题,如果是字符数据,那么就有必要考虑编码问题了。例如:
response.getWriter().print("中国");
上面的代码因为没有设置response.getWriter()的编码,所以服务器默认使用ISO-8859-1来进行编码,而ISO-8859-1不支持中文,所以一定会出现乱码。
所以在使用response.getWriter()发送数据之前,需要先设置response.getWriter()的编码,可以使用response.setCharacterEncoding();方法来设置编码,例如:
response.setCharacterEncoding("UTF-8");
response.getWriter.print("中国");
这样,输出数据就是通过"UTF-8"编码的。
但是,浏览器还不知道服务器发送过来的数据是什么编码格式,所以还是有可能使用错误的编码格式来进行解码,这样还是会导致数据错乱。所以,我么还需要告诉浏览器,服务器发送的数据使用的是什么编码格式。这里需要使用content-type响应头来告诉浏览器,服务器发送的数据是什么编码格式,如下:
response.setContentType("text/html;charset=UTF-8");
response.getWriter.print("中国");
上面的代码通过setContentType()方法设置了响应头content-type的编码为UTF-8,这不只是在响应中添加了响应头,还相当于调用了一次response.setCharacterEncoding("UTF-8"),所以,我么只需要调用一次response.setContentType("text/html;charset=UTF-8");即可。

在静态页面中,通过<meta>来设置响应头,例如:
<meta http-equiv="content-type" content="text/html;charset=UTF-8">
相关文章
相关标签/搜索