java web 解決中文亂碼問題(全面總結)
在開發一個完整的web專案時,總是會遇到各種各樣的中文亂碼問題,例如頁面顯示亂碼,表單提交亂碼,資料庫儲存亂碼等 等,雖然目前也能找到各種各樣的解決方案,但是大部分都沒有總結全面。(我也遇到了中文亂碼問題 這是我抄襲來的 如果原作者需要 請通知我刪除)
(1)準備知識
凡是會出現亂碼的地方都是由於編碼的問題產生的,頁面預設編碼為ISO-8859-1,簡體中文編碼為GB2312,中文漢字集(簡體與 繁體)編碼為GBK,國際編碼為UTF-8。由於UTF-8編碼支援的語言型別最廣,所以在這裡建議凡是用到字元編碼的地方都使用 UTF-8格式。接下來看看所有可能出現亂碼場景的解決方案。
(2)頁面顯示亂碼
-
html頁面
在頁面的<head>標籤內新增<meta>標籤,內容如下
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> (建議這個)
或者
<meta charset="utf-8">
-
jsp頁面
在jsp頁面的頂部加上以下程式碼,重點是charset=UTF-8和pageEncoding="UTF-8"
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
同時在<head>標籤下新增<meta>標籤,程式碼如下
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
為了讓所有新建的jsp頁面預設為utf-8編碼,可以在相應的IDE下設定。以eclipse為例,window > Prefrences > Web > JSP Files > Encoding處改成支援UTF-8格式的選項。
(3)客戶端和伺服器端傳輸亂碼
-
tomcat配置
在tomcat安裝目錄下 > conf > server.xml,在server.xml檔案中找到Connector port="8080"
<Connector port="8080"
protocol="HTTP/1.1"
maxThreads="150"
connectionTimeout="200000"
redirecPort="8443"
URIEncoding="utf-8"/>
-
Request請求
例如以下請求方式
<a href="/myProject/displayServlet?username=張三&password=123">顯示使用者名稱和密碼</a>
這種情況下,可以看出來該請求是GET請求,在接收請求時如果出現亂碼,需要使用以下程式碼
username= new String(username.getBytes("ISO-8859-1"),"UTF-8")
在表單提交的時候,如果是POST請求,與GET請求不一樣,新增的是以下程式碼
request.setCharacterEncoding("utf-8")
注意:request.setCharacterEncoding("utf-8")只在POST請求下生效
-
Response響應
在servlet中利用response進行輸出時,如果出現亂碼,需要新增以下程式碼
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("UTF-8")
-
struts.xml
如果使用了Struts2框架,在strust.xml檔案中新增如下程式碼
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
-
Filter
還有一種最保險的方法是新增自定義編碼過濾器,或者使用spring自帶的過濾器,在web.xml中新增以下程式碼
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
(4)資料庫插入亂碼
在伺服器獲取到正確資料後,插入到資料庫卻出現亂碼,很有可能是資料庫的編碼問題,按照以下方法來做可以避免這種問題
-
安裝
在資料庫安裝過程中會選擇編碼方式,此時選擇utf-8格式
-
建立資料庫
在建立資料庫的過程中,按照以下例子
CREATE DATABASE `share` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
-
建立表
在建立表生成的SQL後面加上
ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
資料庫連線(mysql)
在使用hibernate或者spring連線資料庫時,按照以下例子
//hibernate.cfg.xml或者是applicationContext.xml
//要特別注意如果 寫useUnicode=true&characterEncoding=UTF-8 出現錯誤,那就在&後加上 amp; ,目的是轉義
<property name="connection.url">
jdbc:mysql://localhost:3306/資料庫名字?useUnicode=true&characterEncoding=UTF-8
</property>
(5)總結
在完成上述的講解後,基本不會出現亂碼的情形,大家也可以嘗試下。如果出現了亂碼的情況,也不要著急,先冷靜分析,亂碼是 出現在哪一個環節,然後按照我講的幾部分去找對應的解決辦法。
同時也是教大家一種問問題的方式,先自己分析問題出在哪裡,直接問別人“我的專案中出現了中文亂碼,你能幫我看一下 麼?”和“資料返回頁面的時候出現亂碼了,你能幫我看一下麼?”你覺得別人會喜歡哪種提問方式呢?