浏览器接收到响应的html时,必须知道如何正确解释文字编码,这可以使用HttpServletResponse进行响应之前,通过setContentType()进行设置,例如若要传送给浏览器utf-8编码的文字,则执行以下语句:
response.setContentType("text/html;charset=utf-8");
执行过这条语句后,在对浏览器进行响应时,会送出content-type响应标头,内容为setContentType()中设置的值,text/html表示这是个html网页,而附加的字符集设置除了告诉浏览器处理编码的方式外,还会影响响应对象处理字符串的编码(相当于自行调用HttpServletResponse的setCharacterEnconding(),)注意这句必须在进行响应确认(commit)之前执行完毕才有作用,
另外还必须知道请求对象处理字符串时默认编码,这与容器的实现有关(以tomcat为例,请求对象默认会使用iso-8859-1编码处理字符串)。我们可以使用HttpServletRequest的setCharacterEnconding()方法来指定所使用的编码,例如,若要配合浏览器以utf-8来正确解释文字编码,接收请求时也使用utf-8编码字符串,则可以在取得任何请求值之前,执行以下语句
request.setCharacterEncoding("utf-8")
另外一个处理编码的方式是在取得请求值之后,通过String的getBytes()取得指定编码来取得该字符串的字节数组,然后在重新构造utf-8编码的字符串,例如确定原字符串编码是iso-8859-1,想转换为utf-8编码,可执行以下语句
String username=request.getParameter("name");
String username=new String(username.getBytes("iso-8859-1"),"utf-8");
另外还有一点要注意,如果.java原始代码文件中编写了中文字符串,则必须确认所使用的IDE默认的编码,以及编译时是否指定了正确的编码,否则在编译时无法正确的解释中文字符,最后都会造成显示乱码
下面谈下出现的乱码解决方案,
首先保持IDE对.java文件的编码与web应用使用 的编码一致,在eclipse for j2ee中的windows-->preferences-->workspace是指.java文件的编码
1.对于从jsp页面想servlet跳转中一些参数带有中文,之后想从servlet直接使用PrintWriter对象输出给浏览器
这时就可以在servlet中设置执行这条语句request.setCharacterEncoding("utf-8");是的servlet知道通过utf-8来解析文字编码
之后通过HttpServletResponse对象的response.setContentType("text/html;utf-8");来设置返回给浏览器的网页的编码方式
即可解决中文乱码问题
2
对于从jsp页面想servlet跳转中一些参数带有中文,servlet接收到参数后并不进行对浏览器的反馈,却进行的请求转发如:request.getRequestDispatcher("error.view").forward(request, response);
对于这类同第一种处理方式是完全相同的