Java Web項目中解決中文亂碼方法總結

一、瞭解常識:

 

1.UTF-8國際編碼,GBK中文編碼。GBK包含GB2312,即如果通過GB2312編碼後可以通過GBK解碼,反之可能不成立;

2、web tomcat:默認是ISO8859-1,不支持中文的

3.java.nio.charset.Charset.defaultCharset() 獲得平臺默認字符編碼;

4.getBytes() 是通過平臺默認字符集進行編碼;

 


二、引入

 

在學習任何一門技術時,經常會有初學者遇到中文亂碼問題,比如MySQL,是因爲在安裝時沒有設置;而在Servlet中,也會遇到中文亂碼問題;

比如:

OutputStream out = response.getOutputStream();

out.write(String );

輸出中文時可能會出現亂碼;

比如:

 

[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"));  


 

輸出亂碼的問題是程序用UTF-8編碼,而瀏覽器默認用GBK解碼了,因此會出現亂碼;


三、Servlet相關的幾種亂碼

1、瀏覽器調用jsp,html等頁面中文顯示亂碼

此情況需滿足兩個要求:

 

(1)文件本身是以utf-8編輯保存的myEclipse中在properties中鼠標右鍵選擇utf-8

(2)瀏覽器用utf-8解析:

(手動)==> 在瀏覽器中右鍵選擇編碼格式爲utf-8

(智能)==> 在文件中寫入如: <meta name="content-type" content="text/html; charset=UTF-8">  通過<meta>標籤模擬response頭,起到告訴瀏覽器用utf-8的編碼解析

(智能)==> response.setContentType("text/html;charset=UTF-8");起到告訴瀏覽器用utf-8的編碼解析

常用:

<meta name="content-type" content="text/html; charset=UTF-8">或<meta charset="utf-8">

<%@ pageEncoding="utf-8"%>

<?xml encoding="UTF-8"?>


2、通過瀏覽器調用servlet,頁面顯示亂碼。

Servlet亂碼分爲request亂碼和response亂碼

(1)response亂碼問題

解決方法:

 

在網上很有效的解決方法是添加:

response.setCharacterEncoding("UTF-8");

解決不了,後來又搜到一條解決方法是:

response.setContentType("text/html;charset=utf-8");或者 response.setHeader("content-type","text/html;charset=UTF-8");告訴瀏覽器用utf-8解析。(setHeader是HttpServletResponse的方法。如果想在攔截器Filter中設置字符編碼,則無此方法,因爲Filter的doFilter方法的參數類型是ServletResponse)

兩句都填上,後來終於解決了這個問題;

其實我們應該思考一下本質:

 

response.setContentType("text/html;charset=UTF-8"); 目的是爲了控制瀏覽器的行爲,即控制瀏覽器用UTF-8進行解碼;

response.setCharacterEncoding("UTF-8");目的是用於response.getWriter()輸出的字符流的亂碼問題。如果是response.getOutputStream()是不需要此種解決方案的,因爲這句話的意思是爲了將response對象中的數據以UTF-8解碼後的字節流發向瀏覽器;


==> 情況一:

問題代碼如【引入】的例子

 

我們這裏先來說明一下錯誤的原因,下圖是顯示亂碼的流程圖:


解決方案流程圖:

==>情況二:

問題代碼如下

 

[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使用的碼錶 

解決方案流程圖:


(2)request亂碼問題

request請求分爲post和get,對於不同的請求方式有不同的解決亂碼的方案;
==>POST請求:

錯誤原因:

 

解決方案:

==>GET請求(URI方式傳遞參數亂碼)

出現情況:瀏覽器訪問<a href=""><form method="get">

如:<a href="/webproject/display.jsp?username=張三&password=123">顯示用戶名和密碼</a>

解決方法:問題本質是get方式傳遞的參數內容默認編碼方式問ISO8859-1,而且使用request.setCharacterEncoding("utf-8")也無法解決問題。

法一:要解決這個問題,修改tomcat服務器的配置文件。修改tomcat目錄下的conf/server.xml文件的第43行:

修改前內容:

<Connector port="8080" protocol="HTTP/1.1"

     maxThreads="150"   connectionTimeout="200000"

     redirecPort="8443"/>

修改後內容:

 

<Connector port="8080" protocol="HTTP/1.1"

     maxThreads="150"   connectionTimeout="200000"

     redirecPort="8443"    URIEncoding="utf-8"/>

法二:String usernameString = new String(username.getBytes("ISO-8859-1"),"UTF-8"); (如下圖)
法三:URL轉換 


3、調用數據庫出現亂碼

安裝數據的時候選擇UTF-8


四、JSP相關亂碼解決方案(部分已經在上面介紹了)

問題描述:通過jsp,html,或servlet中的表單元素把參數提交給對應的jsp或者servlet時,在接收的jsp或servlet中接收到的參數中文顯示亂碼。

例如:

提交jsp代碼如下:

<%@ page language="java" pageEncoding="utf-8"%>

<html>

<head>

<title>輸入表單</title>

</head>

<body>

<form id="inputForm" name="inputForm" method="post" action="display.jsp">

      用戶名:<input type="text" name="username"/><br/>

      密   碼  :<input type="password" name="password"/><br/>

     <input type="submit" name="submit" value="提交"/>

</form>

</body>

</html>


接收參數的jsp代碼如下:

<% @  page language="java" pageEncoding="utf-8"%>

<html>

<head>

<tilte>接收表單</title>

</head>

<body>

     <% 在這裏插入

           request.setCharacterEncoding("utf-8");

      %>

       用戶名:<%=request.getParameter("username")%><br/>

      密     碼:<%=request.getParameter("password")%><br/>

</body>

</html>

解決方法:在接收post提交的參數前,使用request.setCharacterEncoding("utf-8")設定接收參數的內容格式爲utf-8編碼。見接收表單中的插入內容即可。當然這種亂碼問題最好使用中文過濾器的方法最好。

 

 

五、properties文件亂碼

 

 

問題描述:在使用一些類庫或者框架時,爲了實現頁面內容國際化,需要編寫對應的properties文件。而properties文件中的中文內容在顯示的時候也會出現亂碼。

解決方法:這個亂碼問題可以通過jdk中的native2ascii工具解決。使用如下命令:

native2ascii   -encoding   utf-8  display.properties    display_zh_CN.properties

出現亂碼問題的原因是因爲java編譯器只能處理Latin-1或unicode編碼的字符文件。

發佈了0 篇原創文章 · 獲贊 8 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章