在使用原生的Servlet進行Web應用開發時常常會遇到一些中文亂碼問題,形成亂碼問題的緣由只有一個:即客戶端與服務端的字符編碼不一致所致使的。html
請求參數亂碼問題編程
服務器端獲取客戶端傳遞過來的數據出現亂碼的問題(即便用get獲取post向服務器發送請求時出現亂碼):數組
get與post請求的亂碼處理時不一致的,當get請求時,其傳遞給服務器的數據時附加在URL地址以後的;而post的請求時,其傳遞給服務器的數據是做爲請求正文傳遞給服務器。瀏覽器
● post請求的亂碼處理:服務器
用戶在表單中填寫的內容在請求正文中被提交給Servlet。當咱們在表單中輸入中文是,Servlet的request的編碼與客戶端不一致,則服務器沒法解析,就會出現亂碼。解決方法是改變請求正文中的字符編碼(對於get請求無效,由於get提交表單的數據在URL中),方法以下:函數
request.setCharacterEncoding("UTF-8");post
● get請求的亂碼處理:編碼
在服務器端獲取get請求的參數時,可使用String類的另一個構造函數,這個構造函數能夠指定字符串的編碼形式。方法以下:code
String username = request.getParameter("username");server
username = new String(username.getBytes("ISO-8859-1"),"UTF-8");
get請求亂碼問題還可使用另一種方法來解決,就是修改Tomcat默認的編碼方式,方法以下:
在Tomcat的安裝目錄下,找到conf文件夾下的server.xml文件並打開,找到其中以下的代碼:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
在Connector元素中添加URIEncoding屬性,並將屬性值修改成UTF-8,詳情以下:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
響應數據亂碼問題
在Servlet編程中,常常須要經過response對象將一些信息返回給瀏覽器給咱們的客戶端,而咱們在服務器端顯示的中文,可是響應給客戶端瀏覽器倒是亂碼。這主要是因爲response對象中的方法返回到瀏覽器的字符串默認使用"ISO-8859-1"字符集進行Unicode字符串到字節數組的轉換,因爲ISO8859-1字符集中根本就沒有包含中文字符,因此Java在進行轉換的時候會將無效的字符編碼輸出給客戶端,因而便出現了亂碼,爲此ServletResponse接口中便定義了setCharaterEncoding、setContentType等方法來指定getWriter方法返回的PrintWriter對象所使用的字符集編碼,因此咱們在寫Servlet程序中,在調用getWriter方法以前設置這些方法的值。咱們爲了防止亂碼,常常將如下兩條語句一塊兒寫上:
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("UTF-8");
只要編寫Servlet文件中含有響應給客戶端的信息,那麼就要寫上這兩句話。最好寫上第二句話,由於它的優先級高,它的設置結果將覆蓋setContentType等方法設置的字符編碼集。