在一开始写java web项目的时候,基本上每个人都不可避免地会遇到乱码的问题,一般我们的解决方法都是这样的:百度一下java web乱码的常用解决方法,然后根据症状找最符合的一个个去试,然后ok完事,然而等到下一次出现相同问题的时候,又得去翻资料。如此治标不治本,实在浪费了我们不少时间,所以还不如花点时间理解透彻这个知识点,以后就不用头疼了。要说编解码这个问题,还得从http请求响应报文的内容说起,我就用最常见的Get和Post请求来说明:
GET请求的HTTP报文格式如下:
GET 请求地址(包括请求参数QueryString) 协议
请求头
POST请求的HTTP报文格式如下:
POST 请求地址 协议
请求头
<!--空行-->
请求体
而我们的web应用的编解码就用于请求地址和请求体。显而易见,GET请求参数的编解码与请求地址的编解码相关,POST请求参数的编解码与请求体的编解码相关。所以如果是GET请求出现乱码,需要修改URL的解码字符集,如在tamcat应用中修改server.xml的URIEncoding属性:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
而如果是POST请求出现乱码,则要通过requset.setCharacterEncoding()去设置相应的编码器,这样request.getParameter()就会根据你设置的编码器进行解码(注意在设置编码器之前获取参数会使编码无效)。在spring mvc中可以直接使用过滤器进行统一编码。喜欢思考的同学会问了,我如何知道浏览器对url和请求体的编码格式了?首先对于url的编码格式,我只能很抱歉地说的确无法知道,这是由浏览器自身决定的,不同浏览器使用的不同的编码方方式,但是所幸现在的主流浏览器都基本使用统一的编码方式——UTF-8,所以我们只要设置URIEncoding=UTF-8,一般就不会出现问题了。而浏览器对请求体的编码,我们就可以掌控了,因为这是由我们服务器决定的。servlet中的response.setCharactEncoding方法或者esponse.setContentType方法(关于这两个方法的区别,可以点击这里,话说设置contentType会使响应头携带编码信息,浏览器可以根据这个编码,这点我可以理解,但是设置characterEncoding是没有编码的头信息的,那浏览器是如何得知的呢?这点让我很纳闷)就是来告诉浏览器对响应内容的解码方式以及发送请求的编码方式的,所以,我们只要使用request.setCharactEncoding和response.setCharacterEncoding设置统一的编码方式,就不会出现乱码的问题了。
总结:
1.如果url传参或者表单get请求乱码就设置web服务器对url的解码方式;
2.如果post请求出现乱码就将requset和response设置为统一的characterEncoding。
如果到这里大家还是不能理解出现乱码的问题所在那也没关系,只要全部设置utf-8就行啦。