关于Servlet中请求对象和相应对象设置编码的一些理解和猜想?
由于是猜想,大概率是错的,只是想给现在的理解留一个记号!
浏览器发送一个HTTP请求,包括url和内容。
服务器拿到这个HTTP请求,交给Servlet。
Servlet拿到请求,可以使用request.setChracterEncoding("utf-8")这种方式设置浏览器请求的编码方式,注意在浏览器中这个请求已经编码了,至于它使用什么编码方式,Servlet不知道,Servlet只能使用它默认的解码方式--ISO-8859-1,但是这里呢,通过request.setChracterEncoding("utf-8")告诉了Servlet使用utf-8解码。这种方式只能解决post的提交方式,如果是get,可以修改tomcat配置文件中的server.xml中的URIEncoding属性。也就是说这种方法只是告诉了Servlet请求内容的解码方式,但是如果是GET请求,请求内容被放在了url中发送过来,虽然url不能包含中文(应该是地址),就需要对url的解码方式进行设置。
现在Servlet知道了怎么解码拿到的HTTP请求,那么Servelt要发送一个HTTP响应,可以通过response.setCharacterEncoding("utf-8");现在浏览器一点也不知道服务器的响应是什么编码的。如何让浏览器知道呢?response.setContentType("text/html;charset=utf-8");这个方法不仅设置了响应内容类型,还告诉了浏览器编码方式。
一切乱码问题都是编码和解码方式不匹配或者不兼容导致的
假设浏览器使用的编码方式都是UTF-8(假设哈)
UTF-8字符发送到服务器,服务器需要使用UTF-8进行解码(请求)
同样,在不通知浏览器的情况下,服务器要发送UTF-8编码的字符浏览器才能正确解码(响应)
还有就是不要忽略eclipse的编码设置,如果你在eclipse中全局设置了解码方式为UTF-8,那么就算是乱码的,打印到控制台还是不是乱码呢?
浙公网安备 33010602011771号