1. 程式人生 > >java web 解決中文亂碼問題(全面總結)

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格式的選項。

web專案中的中文亂碼問題

jsp頁面編碼設定

(3)客戶端和伺服器端傳輸亂碼

  • tomcat配置

在tomcat安裝目錄下 > conf > server.xml,在server.xml檔案中找到Connector port="8080"

所在的標籤,在標籤內部新增URIEncoding="utf-8",新增後為

<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&amp;characterEncoding=UTF-8  
  </property>

(5)總結

 在完成上述的講解後,基本不會出現亂碼的情形,大家也可以嘗試下。如果出現了亂碼的情況,也不要著急,先冷靜分析,亂碼是 出現在哪一個環節,然後按照我講的幾部分去找對應的解決辦法。

 同時也是教大家一種問問題的方式,先自己分析問題出在哪裡,直接問別人“我的專案中出現了中文亂碼,你能幫我看一下   麼?”和“資料返回頁面的時候出現亂碼了,你能幫我看一下麼?”你覺得別人會喜歡哪種提問方式呢?