本文轉自:https://blog.csdn.net/kevinr1990/article/details/78655407
Servlet與頁面之間的中文亂碼問題
1介紹
很多時候,我們在寫JavaEE的Servlet程序時,需要從前端頁面獲取數據,在控制台打印輸出,或者在Servlet中設置名稱,在其它頁面顯示或其他程序中輸出等。如果數據帶有中文字符,經常容易出現亂碼問題。
現在對各種亂碼的情況做一個歸納:
2原因分析
亂碼產生的原因是在一方編碼后,另一邊解碼時,解碼的字符集和編碼的不一致而導致的。可以簡單理解為(各種字符需要先編碼以后,再傳輸,對方接收以后再按照指定的字符集進行解碼,同時顯示到頁面,或者打印到控制台)。
不同數據來源的編(解)碼格式不同:
數據來源 | 默認編碼格式 |
---|---|
瀏覽器頁面 | GBK (可在瀏覽器頁面右鍵切換) |
request(get) | ISO-8859-1 |
request(post) | GBK(同瀏覽器),但是如果是服務器來的頁面一般已經設置了UTF-8(例如JSP提交的頁面) |
Servlet(response) | ISO-8859-1 |
3亂碼處理方式
接收中文亂碼(就是頁面向服務器提交數據)
get方式
解決方式:new String(string.getBytes("ISO-8859-1"),"UTF-8");
分析:表單中文數據在頁面以ISO編碼后,通過Http協議傳輸,到達Servlet后,若以UTF-8解碼,會出現亂碼。所以需要先轉成字節(ISO-8859-1解碼,傳過來的是以它編碼的),再包裝成字符串(UTF-8編碼)。Servlet中就可以顯示了(UTF-8)。
post方式
解決方式:request.setCharacterEncoding("UTF-8");
分析:這里單向設置服務器端的解碼方式UTF-8即可(注意是通過request設置)。因為從服務器來的頁面一般已經設置成了UTF-8格式了(例如JSP提交的頁面)。
- 1
- 2
- 3
- 4
- 5
- 6
輸出中文亂碼(服務器向頁面輸出)
字符流
解決方式一:response.setContentType("text/html;charset=UTF-8");
等價於解決方式二:response.setCharacterEncoding("UTF-8");//UTF-8編碼
response.setHeader("Context-Type","text/html;charset=utf-8");
//通知瀏覽器UTF-8解碼網頁文件
分析:方式一和方式二作用一樣。這種場景一般是Servlet程序中有中文字符,需要向頁面輸出。先設置服務器端的編碼方式UTF-8(注意是通過response設置),再通過設置響應的頭字段,通知瀏覽器以UTF-8進行解碼即可。
字節流
解決方式:response.setHeader("Content-Type", "text/html;charset=UTF-8");
// 設置瀏覽器默認打開的時候采用的字符集編碼
response.getOutputStream().write("中文".getBytes("UTF-8"));
// 設置中文轉成字節數組的時候取出的編碼,默認會是ISO-8859-1
分析:字節流的中文輸出包括兩步:先通知瀏覽器以UTF-8解碼。再想頁面(字節流)輸出字節。輸出內容:將中文字符串轉成字節數組(並設置以指定的UTF-8編碼)。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
4注意
1,一般情況下,JSP頁面的默認編碼字符集要設置成UTF-8。否則無法完成中文顯示和數據傳輸。這里不考慮GBK的情況
2,在服務器端的程序之間,數據傳輸都是以UTF-8格式傳輸的。所有不用考慮中文亂碼問題
3,setCharacterEncoding(“UTF-8”)是設置字符集,request調用是設置解碼方式(因為是從頁面過來的),而response調用時設置編碼方式(因為要想頁面輸出內容,先在Servlet中編碼)
4,getBytes(“UTF-8”);方法通過字符串調用,是按照指定字符集編碼。
5,new String(string.getBytes(“ISO-8859-1”),”UTF-8”);方法將string字符串先以原始(ISO-8859-1)進行解碼轉成字節數組,在以(UTF-8)編碼封裝成新字符串。