關於Servlet的PrintWriter 中文亂碼問題


   ps:servlet的PrintWriter和ServletOutputStream是不能同時使用的,同時使用會拋異常;

       PrintWriter是字符流.ServletOutputStream是字節流.字節流是萬金油,所以這里說的是當使用字符流PrintWriter的時候;

       如下代碼:

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String data = "中國";
        response.getWriter().write(data);
}

向瀏覽器輸出中國兩字;很愉快的發布之后,瀏覽器返回的是??.

是因為:

1; 當服務器去調用servlet的時候同時創建了一個resquest和一個response對象.resquest用來存儲客戶端發送請求,response用來存儲服務器返回的數據;

2: 當Servlet拿着data去查它的默認碼表,Sun公司顯然是查國外的碼表:ISO8859-1之類的...查完碼表將它存儲在response里,然后輸出在瀏覽器里,瀏覽器的編碼在中文的windows下一般是gbk或者gb2312.瀏覽器拿到ios編碼的字符再查gbk的碼表,顯然就是亂碼了.

解決:既然是Servlet里出的問題,那么就修改它的編碼方式:

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String data = "中國";
        response.setCharacterEncoding("UTF-8");//一般我們將字符編碼設置成UTF-8.國際標准.
        response.getWriter().write(data);
            
}

這個時候部署上去看見三個字:涓浗,是因為我們的瀏覽器的編碼是GBK(默認),所以我們要告知瀏覽器的編碼方式(當然你也可以自己在瀏覽器里設置,不推薦:讓用戶自己去操作的都是不良好的用戶體驗;

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setHeader("Content-type", "text/html;charset=UTF-8");//告知瀏覽器編碼方式;
        String data = "中國";
        response.setCharacterEncoding("UTF-8");
        response.getWriter().write(data);
            
    }

 這樣我們就能看見"中國"啦~


免責聲明!

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



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