servlet 中文乱码问题及解决方案

1、常识了解

 

1.GBK包含GB2312,即若是经过GB2312编码后能够经过GBK解码,反之可能不成立; html

2.java.nio.charset.Charset.defaultCharset() 得到平台默认字符编码; java

3.getBytes() 是经过平台默认字符集进行编码; 浏览器

2、中文乱码出现

在学习任何一门技术时,常常会有初学者遇到中文乱码问题,好比MySQL,是由于在安装时没有设置;而在Servlet中,也会遇到中文乱码问题; 服务器

好比: post

OutputStream out = response.getOutputStream(); 学习

out.write(String ); ui

输出中文时可能会出现乱码; 编码

好比: spa

[java]  view plain copy
  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  2.           
  3.         OutputStream out = response.getOutputStream();  
  4.         String data = "博客";  
  5.         out.write(data.getBytes("UTF-8"));  
  6.     }  


输出乱码的问题是程序用UTF-8编码,而浏览器用GB2312解码,所以会出现乱码; .net

Servlet乱码分为request乱码和response乱码;

3、response中文乱码

在网上颇有效的解决方法是添加:

response.setCharacterEncoding("UTF-8");

解决不了,后来又搜到一条解决方法是:

respnse.setHeader("content-type","text/html;charset=UTF-8");

两句都填上,后来终于解决了这个问题;

其实咱们应该思考一下本质;

  

问题1:

咱们这里先来讲明一下错误的缘由,下图是显示乱码的流程图:

response.setContentType("text/html;charset=UTF-8"); 目的是为了控制浏览器的行为,即控制浏览器用UTF-8进行解码;

response.setCharacterEncoding("UTF-8"); 的目的是用于response.getWriter()输出的字符流的乱码问题,若是是response.getOutputStream()是不须要此种解决方案的;由于这句话的意思是为了将response对象中的数据以UTF-8解码后发向浏览器;

解决方案流程图:

 

 

问题2

问题代码以下:

[java]  view plain copy
  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  2.         PrintWriter out = response.getWriter();  
  3.         String data = "博客";  
  4.         out.println(data);    
  5.     }  


浏览器输出: ??

缘由:"博客"首先被封装在response对象中,由于IE和WEB服务器之间不能传输文本,而后就经过ISO-8859-1进行编码,可是ISO-8859-1中没有“博客”的编码,所以输出“??”表示没有编码;

错误代码流程图:

而解决方案是:response.setCharacterEncoding("GB2312"); 设置response使用的码表

 

解决方案流程图:

 

 

补充:经过<meta>标签模拟response头;

<meta http-equiv="content-type" content="text/html"/> 等价于 response.setContentType("text/html");


4、request乱码问题

 

request请求分为post和get,对于不一样的请求方式有不一样的解决乱码的方案;

 

1.post请求乱码

 

错误缘由:

 

解决方案:


2.get请求乱码

 

PS:总结下 request的乱码的缘由在于http协议只是用ISO-8859-1的字符集传输,全部所有能够经过 new String(str.getBytes("ISO-8859-1"),"UTF-8")的方式来解决。response解决的根本在于传输和显示都是用一种编码。

相关文章
相关标签/搜索