http請求中的中文亂碼問題

經過瀏覽器訪問服務器頁面和資源時,不可避免地要傳送中文字串,若是客戶機與服務器不能用同一碼錶解析字串,確定會出現各類各樣的亂碼問題。我總結了幾個亂碼場景及解決辦法,以下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的編碼方式一致
相關文章
相關標籤/搜索