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請求亂碼

 

相關文章
相關標籤/搜索