经过Java Web 编码问题一:jsp的编码,咱们知道咱们只须要在文件中设置好编码,就基本没有问题了。可是咱们们之间使用Servlet的呢?
html
下面是一个简单的测试Servlet,若是保存UserInfo.saveUser(phoneNum)返回真就输出成功,不然就输出失败:java
public class UserRegisterServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final Logger log = LogManager.getLogger(); /** * @see HttpServlet#HttpServlet() */ public UserRegisterServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); String phoneNum = request.getParameter("phoneNum"); log.info(phoneNum); if(UserInfo.saveUser(phoneNum)) response.getWriter().append("成功"); else response.getWriter().append("失败"); } }
首先先看一看这一句,这是设置浏览器响应的编码:算法
response.setContentType("text/html;charset=utf-8");
咱们来看一看客服端浏览器在个人的Servlet中有这一句和没有这一句的其别,下面分别是在Servlet中设置了和没有设置的客服端浏览器响应头的的信息(Firefox debug):浏览器
那么响应头的Content-Type对浏览器的有什么影响呢?请参见浏览器的解码过程:服务器
http://www.w3.org/html/wg/drafts/html/master/syntax.html#parsing-with-a-known-character-encodingapp
从文档中咱们知道对浏览器Content-Type是有较高优先级的,若是咱们服务器用的是utf-8编码,而咱们没有在Content-Type中设置,那么浏览器就会使用特定的算法,或者默认的编码或者header中meta中的信息以及其它方式来进行解码,不一样的浏览器有所不一样。可是显然这样并不必定是正确的,好比在中国通常本地默认的是GBK的编码方式,来解UTF-8显然会出现乱码。因此建议在Servlet要想浏览器输出中文的时候用
jsp
response.setContentType("text/html;charset=utf-8");
来设置浏览器的响应编码,固然charset能够设置为GBK或者GB18030。
测试