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