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); }
這樣我們就能看見"中國"啦~
