一个请求从浏览器到服务器是有可能需要进行多次编码的。首先从浏览器开始,报文可以通过Http Header 的Content-Type来制定编码的格式。然后进入Tomcat中,Tomcat会根据Content-Type头进行对应的解码。解码后将请求包转成Servlet传给后台。到了Servlet这个层面,我们可以通过ServletRequest的setCharacterEncoding来修改报文编码。
在你程序上设置了正确的编码后。如果你的文件编码格式和JVM编码不匹配仍然导致控制台的乱码(有可能你输出到文件不乱码,但是就是控制台是乱码的),因为你在文件上输入中文的时候,虚拟机由于编码和文件编码不同将会错误的理解文件字符字面上的意思,所以输出的时候乱码。
解决办法:首先保证程序设置正确(如设置了req.setCharacterEncoding("utf-8"))。然后检查文件的编码格式(在idea上可以简单的检查右下角)
文件编码格式正确了然后检查JVM的编码(可以调用Charset.defaultCharset()来获得),JVM默认的编码是和操作系统一样的,中文的一般是BGK。可以通过为虚拟机设置-Dfile.encoding=utf-8来设置编码.