首先明确為什麼會出現亂碼:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICdzFWRoRXdvN1LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX90kaNl3ZE10MnR1T6VEVjZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DN1ADMxkjMxIzNyMDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
1.用戶端發送請求,浏覽器将資料進行打包(預設utf-8),然後發送至伺服器
2.伺服器對接收的資料進行解碼(預設為iso-8859-1),然後将資料進行處理,最後打包傳回浏覽器
3.浏覽器将傳回的資料包進行解碼顯示,完成一次連接配接互動。
在這一過程中應該確定所有步驟的編碼或解碼方式保持一緻,否則就會出現亂碼問題。
一、表單的中文問題
浏覽器對表單中的資料(非ascii字元)會進行編碼。所使用的編碼是打開該表單所在的頁面時所使用的編碼。
1、 靜态頁面(html)編碼問題
使用
<meta http-equiv="content-type" content="text/html;charset=utf-8">
指定打開頁面時的編碼。
2、 Jsp頁面編碼問題
在JSP頁面上輸入中文,請求頁面後不出現亂碼。應該保證:
contentType="text/heml;charset=UTF-8"pageEncoding="UTF-8" charset和pageEncoding
的編碼一緻,且都支援中文,通常建議取值UTF-8
還需要保證浏覽器的顯示的字元編碼也和請求的JSP頁面的編碼一緻
3、servlet中編碼問題
擷取中文參數值:預設參數在傳輸過程中使用的編碼為ISO-8859-1
①對于POST請求:在擷取請求資訊之前(調用request.getParameter() 或者是 request.getRead())使用request.setCharacterEncoding(“utf-8”)即可
②對于GET請求:前面的方式對于GET無效,可以通過修改Tomcat的server.xml檔案的方式,修改方式下文提到
//指定request對象解碼時所使用的編碼格式。
a. request.setCharacterEncoding("utf-8");
b.如果要輸出資料到浏覽器,還要使用
response.setContentType("text/html;charset=utf-8");
4、 如果要儲存資料到資料庫
a. 建立資料庫時,使用:
create database cc default
character set utf8;
b. jdbc驅動程式,指定資料庫編碼,即告訴驅動程式,目前資料庫儲存資料所使用的
編碼是什麼。
jdbc:mysql://localhost:3306/cc?
useUnicode=true&characterEncoding=utf8
二、連結位址包含中文 (GET方式)
浏覽器會對連結位址中的中文(包含其它ascii字元以外的字元,比如日文,部分的拉丁字元)進行編碼,預設采用采用utf-8編碼。
伺服器端預設情況下采用iso-8859-1解碼。此時,可以通過設定配置檔案的方式,告訴伺服器采用指定的編碼來解碼。
tomcat_home/conf/server.xml 添加 URIEncoding=”utf-8”,作用是:伺服器
對于get請求,采用“utf-8”來解碼。
三、請求參數當中包含中文
請求參數當中包含中文,浏覽器也會編碼,所使用編碼與打開該頁面時的編碼一緻。
方案一:
保證頁面打開時的編碼與URIEncoding的設定一緻。
方案二:
如果頁面打開時的編碼與URIEncoding的設定不一緻,可以
<a href="xxx?name=<%=URLEncoder.encode("中文","編碼")%>"></a>