經過瀏覽器訪問服務器頁面和資源時,不可避免地要傳送中文字串,若是客戶機與服務器不能用同一碼錶解析字串,確定會出現各類各樣的亂碼問題。我總結了幾個亂碼場景及解決辦法,以下html
一、服務器上的中文字串被客戶端訪問時出現的亂碼問題瀏覽器
緣由:瀏覽器在解析中文時,不知道該用什麼碼錶去解析,就會用默認的gb2312去解析,確定會出現亂碼服務器
解決辦法:以什麼碼錶寫入流,在響應的請求頭裏就告訴瀏覽器用什麼碼錶,例子使用utf-8post
//告訴瀏覽器使用UTF-8碼錶解析 response.setHeader("Content-type","text/html;charset=UTF-8");//若是寫成text/html,charset=UTF-8就會變成了下載,必定要當心 String data="我是誰「; OutputStream out = response.getOutputStream(); out.write(data.getBytes("UTF-8)); //以UTF-8寫入輸出流
//告訴瀏覽器使用UTF-8碼錶解析 response.setHeader("content-type","text/html;charset=UTF-8"); //告訴response以什麼碼錶向瀏覽器寫出數據 response.setCharacterEncoding("UTF-8"); String data="我是誰「; OutputStream out = response.getOutputStream(); out.write(data);
上面兩種方法的效果是同樣的,除了上面兩種寫法,還有一種更簡單的寫法,效果同上。ui
//告訴瀏覽器使用UTF-8碼錶解析 //告訴response以什麼碼錶向瀏覽器寫出數據 response.setContentType("text/html;charset=UTF-8"); String data="我是誰「; OutputStream out = response.getOutputStream(); out.write(data);
最後一種寫法原理與上面三種不同,這是在html文檔裏經過meta標籤告訴瀏覽器使用什麼碼錶編碼
//告訴瀏覽器使用UTF-8碼錶解析 String data="我是誰「; OutputStream out = response.getOutputStream(); out.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>".getBytes()); out.write(data.getBytes("UTF-8)); //以UTF-8寫入輸出流
二、客戶端提交中文到服務端致使的亂碼url
緣由:客戶端以UTF-8編碼,服務端中的request以默認的Iso8859碼錶解析spa
解決辦法:告訴request用UTF-8碼錶解析code
下面咱們看看若是告訴request,因爲get請求與post請求傳參方式不同,所以在這分開舉例server
post請求解決方式
request.setCharacterEncoding("UTF-8");
String para = request.getParameter("username");
get請求解決方式
String name= request.getParameter("username"); //以原來的編碼解析再以UTF-8編碼 name = new String(name.getBytes("iso8859-1"),"UTF-8");
注意:post請求處理方式對get請求無效,是由於在get請求中參數是在url路徑中出現
不過能夠經過修改server.xml文件中配置編post請求處理方式適用於get請求,配置文件修改以下:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI="true"/> //讓URI編碼方式與servlet中request的編碼方式一致