ps:servlet的PrintWriter和ServletOutputStream是不能同時使用的,同時使用會拋異常;html
PrintWriter是字符流.ServletOutputStream是字節流.字節流是萬金油,因此這裏說的是當使用字符流PrintWriter的時候;ios
以下代碼:windows
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的碼錶,顯然就是亂碼了.spa
解決:既然是Servlet裏出的問題,那麼就修改它的編碼方式:code
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String data = "中國"; response.setCharacterEncoding("UTF-8");//通常咱們將字符編碼設置成UTF-8.國際標準. response.getWriter().write(data); }
這個時候部署上去看見三個字:涓浗,是由於咱們的瀏覽器的編碼是GBK(默認),因此咱們要告知瀏覽器的編碼方式(固然你也能夠本身在瀏覽器裏設置,不推薦:讓用戶本身去操做的都是不良好的用戶體驗;htm
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); }
這樣咱們就能看見"中國"啦~對象