java-response-亂碼解決


(1)響應體設置文本

PrintWriter getWriter()

獲得字符流,通過字符流的write(String s)方法可以將字符串設置到response 緩沖區中,隨后Tomcat會將response緩沖區中的內容組裝成Http響應返回給瀏覽   器端。

 

關於設置中文的亂碼問題

原因:response緩沖區的默認編碼是iso8859-1,此碼表中沒有中文,可以通過      response的setCharacterEncoding(String charset) 設置response的編碼

 

但我們發現客戶端還是不能正常顯示文字

原因:我們將response緩沖區的編碼設置成UTF-8,但瀏覽器的默認編碼是本地系     統的編碼,因為我們都是中文系統,所以客戶端瀏覽器的默認編碼是GBK,我們可以     手動修改瀏覽器的編碼是UTF-8。

 

我們還可以在代碼中指定瀏覽器解析頁面的編碼方式,

通過response的setContentType(String type)方法指定頁面解析時的編碼是UTF-8

response.setContentType("text/html;charset=UTF-8");

 

上面的代碼不僅可以指定瀏覽器解析頁面時的編碼,同時也內含            setCharacterEncoding的功能,所以在實際開發中只要編寫      response.setContentType("text/html;charset=UTF-8");就可以解決頁面輸出中文亂碼問題。

request.setCharacterEncoding("UTF-8");//將獲取的內容以UTF-8顯示----POST方式提交

        request.setCharacterEncoding("UTF-8");//將獲取的內容以UTF-8顯示  POST方式提交
        // 1、獲得請求方式
        String method = request.getMethod();
        // 2、獲得請求的資源相關內容
        String URI = request.getRequestURI();
        StringBuffer URL = request.getRequestURL();
        String query = request.getQueryString();
        String HEADER = request.getHeader("User-Agent");//取指定頭名稱
        String username = request.getParameter("username");//指定請求體

//如果是get方式提交,需要先將提交內容進行"iso8859-1"編碼,再使用"UTF-8"解碼(大寫)下圖   當然一般現實中很少用get提交表單
username = new String(username.getBytes("iso8859-1"), "UTF-8");

        String password = request.getParameter("password");
        System.out.println(username + "...." + password);
        response.setContentType("text/html;charset=UTF-8");//將響應的內容以UTF-8發送
        response.getWriter().write(username + "...." + password + "...." + method + "...." + URI + "...." + URL + ".."
                + query + ".." + HEADER);

 GET方式提交原理如下圖

 tomcat默認全部都是用ISO-8859-1編碼,不管你頁面用什么顯示,Tomcat最終還是會替你將所有字符轉做ISO-8859-1.那么,當在另目標頁面再用GBK翻譯時就會將本來錯的編碼翻譯成GBK的編碼,這時的文字會亂碼. 

所以需要先將得到"字符"(不管是什么)都先用字節數組表示,且使用ISO-8859-1進行翻譯,得到一個在ISO-8859-1編碼環境下的字節數組.例如:AB表示成[64,65].然后再用GBK編碼這個數組,並翻譯成一個字符串. 

那么我們可以得到一個編碼轉換的過程 
假設:GBK碼("你")->URLencode后變成->(%3F%2F)->Tomcat自動替你轉一次ISO-8859-1->得到( 23 43 68 23 42 68 每一個符號表示為ISO-8859-1中的一個編碼)->接收頁面--->再轉一次為ISO-8859-1的Byte數組[23,43,68,23,42,68]--->用GBK再轉為可讀的文字--->(%3F%2F"---->轉為("你")

 

//也可以Tomcat里server.XML設置字符集直接指定

 

 

 

 

 

 3.相關知識延伸閱讀 
3.1)在URL中中文字符通常出現在以下兩個地方: 
http://localhost:8080/example/中 國 name=中國 
(1)Query String中的參數值,比如 keywords=中國 
(2)servlet path,比如: /中 國 
3.2)出現亂碼問題的原因主要是以下幾方面: 
(1)瀏覽器:我們的客戶端(瀏覽器)本身並沒有遵循URI編碼的規范。 
(2)Servlet服務器:Servlet服務器的沒有正確配置。 
3.3)相關知識:http請求的幾個環節 
瀏覽器(ie firefox)—————–>Servlet服務器 ——————–>瀏覽器顯示 
<編碼> < 解碼成unicode,然后將顯示的內容編碼> <解碼> 
(1)瀏覽器把URL(以及post提交的內容)經過編碼后發送給服務器。 
(2)這里的Servlet服務器實際上指的是由Servlet服務器提供的servlet實現ServletRequestWrapper, 
不同應用服務器的 servlet實現不同,這些servlet的實現把這些內容解碼轉換為unicode, 
處理完畢后,然后再把結果(即網頁)編碼返回給瀏覽器。 
(3)瀏覽器按照指定的編碼顯示該網頁。 
注意: 
當對字符串進行編碼和解碼的時候都涉及到字符集,通常使用的字符集為ISO8859-1、GBK、UTF-8、UNICODE。 
3.4)相關知識:URL的組成及說明 
域名:端口/contextPath/servletPath/pathInfo queryString 
(1)contextPath是在Servlet服務器的配置文件中指定的 
(a)對於weblogic:contextPath是在應用 的weblogic.xml中配置。

 

具體參考:https://blog.csdn.net/zhou_pp/article/details/83545602


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM