遇见了使用servlet时候输出页面“中文”信息的时候,显示总是??????,或者是中文乱码。我感到难过。查询到解决方案贴下。
首先不论是使用reponse.setCharacterEncoding("UTF-8")还是使用response.setHeader("content-type", "text/html;charset=UTF-8");都要注意一点。就是要放在doGet或者是doPost的最上面,然后再去使用PrintWriter out = response.getWriter();或者是OutputStream outputStream = response.getOutputStream(); 不然没用。
第二个问题就是:服务器后端servlet中文信息返回,使用response乱码的问题中,setCharacterEncoding()与setContentType()区别是什么。就是上面红字了里面的两种方法有时候会一个用utf-8还是会乱码,这是为什么。其实这两个函数的作用是有一点不一样的。所以用response.setHeader("content-type", "text/html;charset=UTF-8");更方便啦~~一本万利.
原因看下面的转载内容吧~
转载自博客:http://blog.csdn.net/mingliangniwo/article/details/44178491
他的博客也是转的,转自这个博客:http://blog.csdn.net/jiangwei0910410003/article/details/22886847
这里我们输出的是"Hello World"英文,使用浏览器去访问的时候是没有乱码问题,下面我们在将代码改写一下,
- response.getOutputStream.write("中国".getBytes("utf-8"));
- response.setHeader("Content-type", "text/html;charset=utf-8");
这里我们在扩展一下就是还有一种方式控制浏览器的打开码表,那就是使用<meta>标签来实现:
- response.getOutputStream().write("<meta http-equiv='content-type' content='text/html;charset=utf-8'>".getBytes());
上面使用的是字节流的方式来给客户机发送数据的,有时候我们可能会使用字符流来显示数据,因为字符流在特定场合下回比字节流更方便的输出,其实这里使用response.getWriter()来获取一个PrintWriter字符流对象,然后我们可以使用PrintWriter对象的write方法直接写字符串数据,但是这里也是需要来解决乱码的问题,而且这里的需要解决的问题比上面的字节流更麻烦。下面来看一下吧:
- response.getWriter.write("中国");
- response.setHeader("Content-type","text/html;charset=utf-8")
上面我们使用字节流来进行书写数据的时候,是没有问题的,因为是将"中国"的字节数据直接写到Response容器中的,所以不会涉及到Response容器编码的问题。
所以说当我们在使用字符流写入数据的时候,我们一定要记得修改Response容器的编码,不然会出现乱码的
- response.setCharacterEncoding("utf-8");
- response.setHeader("content-type", "text/html;charset=utf-8");
- response.setContentType("text/html;charset=utf-8");
其实这一行代码就相当于上面的两行代码的效果,因为在setContentType方法中已经调用了setCharacterEncoding方法设置了Response容器的编码了。