pageEncoding 优先级高于 contentType,pageEncoding会按指定的编码转译成统一的utf-8。html
*.jsp(按pageEncoding) ->*servlet.java->*.class->容器load class解析执行返回结果内容java
-> utf-8(无论什么编码方式)->utf-16浏览器
上面阶段jsp转java造成的*.java是utf-8格式的文件,无论jsp指定的什么编码方式,java->*.class也是utf-8格式的tomcat
这个转义到java的编码过程是必然的服务器
setContentType是浏览器展示给客户端使用的编码,setCharacterEncoding设置的setContentType的charset的内容。jsp
浏览器在发送url请求时候会对url和参数进行编码,编码方式也是经过response.setCharacterEncoding来设置的。post
jsp中使用<%@ page pageEncoding="UTF-8"%>,不指定contentType也不使用response.setCharacterEncoding,将对服务器响应的编码。response.setContentType("text/html;charset=UTF-8");这个会影响到jsp页面浏览器第1阶段,解析成java阶段的请求方式。编码
浏览器在接收服务器数据和发送数据到服务器时所使用的编码是相同的,默认状况下均为JSP页面的response.setCharacterEncoding参数(或者contentType和 pageEncoding参 数),咱们称其为浏览器编码。这个是有顺序优先级的。url
对于服务器方面,post方式在jsp中设置request.setCharacterEncoding和response.setCharacterEncoding的编码方式相同应该就能够避免乱码。code
url和get方式因为tomcat编码方式是iso-8859-1,因此用两种方式来处理URIEncoding=GBK(是直接将get请求和url用GBK编码)和useBodyEncodingForURI(是在server返回客户端时使用setCharacterEncoding来编码请求的数据)
这个图很经典的说明内存中unicode的包含大的桥梁做用,只要正确的双向编码就能避免乱码问题。