请求数据是由浏览器发送服务器的,请求数据的编码也是由浏览器决定的。

GET请求解读编码

当客户端通过GET请求发送数据给服务器时,无论是UTF-8还是GBK编码,服务器都认为是ISO-8859-1,需要在使用request.getParameter()获取数据后,再转发成正确的编码。
例如客户端以UTF-8发送的数据,使用如下转码方式:
String name = request.getParameter(“name”);
name = new String(name.getBytes(“iso-8859-1”), “utf-8”);

POST请求解读编码

当客户端通过POST请求发送数据给服务器时,可以先通过request.setCharacterEncoding()来指定编码,然后再使用reuqest.getParameter()方法来获取请求参数,那么就是用指定的编码来读取了。
但如果没有指定编码,那么默认还是使用ISO-8859-1来解读。
request.setCharacterEncoding(“utf-8”);
String name = request.getParameter(“name”);

响应编码

使用服务器默认编码

服务器通过response对象向给客户端发送数据!如果响应的数据不是字符数据,那么就无需去考虑编码问题。当然,如果响应的数据是字符数据,就必须要考虑编码的问题。
response.getWriter().print(“测试”);
因为没有设置repsonse.getWriter()字符流的编码,服务器使用默认的编码(ISO-8859-1)来处理,因为ISO-8859-1不支持中文,所以一定会出现乱码的。

指定服务器编码方式

针对非英文在使用response.getWriter()发送数据之前,设置response.getWriter()的编码
response.setCharacterEncoding(“utf-8”);
response.getWriter().print(“测试”);
因为在使用response.getWriter()输出之前已经设置了编码,所以输出的数据为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”)即可,而无需再去调用response.setCharacterEncoding(“utf-8”)了。

静态页面设置编码

在静态页面中,使用来设置content-type响应头,例如:

URL编码

通过页面传输数据给服务器时,如果包含了一些特殊字符是无法发送的。这时就需要先把要发送的数据转换成URL编码格式,再发送给服务器。
其实需要我们自己动手给数据转换成URL编码的只有GET超链接,因为表单发送数据会默认使用URL编码。
通过URL编码,把数据发送给服务器!服务器会自动识别出数据使用URL编码过的,然后会自动把数据转换回来。
因为URL默认只支持ISO-8859-1,这说明在URL中出现中文和一些特殊字符可能无法发送到服务器。所以我们需要对包含中文或特殊字符的URL进行URL编码。