亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

JavaEE中用response向客戶端輸出中文數據亂碼問題分析

2019-11-26 15:22:54
字體:
來源:轉載
供稿:網友

  Web服務器收到客戶端的http請求,會針對每一次請求,分別創建一個用于代表請求的request對象,和代表響應的response對象。request和response對象既然代表請求和響應,那我們要獲取客戶機提交過來的數據,只需要找request對象就行了。要向客戶機輸出數據,只需要找response對象就行了。

復制代碼 代碼如下:

 package com.yyz.response;
 import java.io.IOException;
 import java.io.OutputStream;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 //輸出中文的問題
 public class ResponseDemo extends HttpServlet {
     public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         String data = "中國";
         OutputStream out = response.getOutputStream();
         out.write(data.getBytes());
         /**
          *     out.write(data.getBytes());這句代碼涉及兩次查閱碼表。
          *    "中國"從字符數據變成字節數據的時候,會查閱gb2312碼表。
          *    數據發送到瀏覽器端要顯示的時候,需要再次查閱碼表,這時查閱的碼表與瀏覽器的設置有關。
          */
         }
     public void doPost(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
            doGet(request,response);
     }
 }

瀏覽器編碼設置為GB2312時的測試結果:

瀏覽器編碼設置為UTF-8時的測試結果:

  為了讓我們的網站能被國外用戶訪問,我們在將字符數據變成字節數據時,要指定轉換的碼表為UTF-8。但這時如果瀏覽器以GB2312打開,又會出現亂碼問題。雖然可以通過改變瀏覽器的設置來解決這個亂碼問題,但不利于增強用戶體驗。因而我們需要用程序告訴瀏覽器查閱何種碼表顯示數據。

復制代碼 代碼如下:

 package com.yyz.response;
 import java.io.IOException;
 import java.io.OutputStream;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 //輸出中文的問題
 public class ResponseDemo extends HttpServlet {
     public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         //在服務器端,數據是以哪個碼表輸出的,那么就要控制瀏覽器以哪個碼表打開。
         String data = "中國";
         response.setHeader("content-type", "text/html;charset=UTF-8");
         OutputStream out = response.getOutputStream();
         out.write(data.getBytes("UTF-8"));
     }
     public void doPost(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
            doGet(request,response);
     }
 }

 多學一招:

使用HTML語言里面的<meta>標簽來控制瀏覽器行為。

<meta http-equiv="Content-type'' content=''text/html;charset=UTF-8">
http-equiv模擬了HTTP的響應頭,告訴瀏覽器以UTF-8的碼表打開。真正的響應頭優先于用http-equiv模擬的響應頭。

 實際開發中,服務器向瀏覽器寫文本數據應該用字符流。但是通過response的getWriter方法拿到的字符流默認的碼表是ISO8859-1,這張碼表里是沒有中文對應的編碼的,因而會把?對應的編碼發送給瀏覽器,瀏覽器打開后全是問號。通過response的setCharacterEncoding可以修改服務端發送數據時查閱的碼表。

復制代碼 代碼如下:

 package com.yyz.response;
 import java.io.IOException;
 import java.io.PrintWriter;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 //輸出中文的問題
 public class ResponseDemo extends HttpServlet {
     public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         //在服務器端,數據是以哪個碼表輸出的,那么就要控制瀏覽器以哪個碼表打開。
         String data = "中國";
         response.setHeader("content-type", "text/html;charset=UTF-8");
         response.setCharacterEncoding("UTF-8");
         PrintWriter out = response.getWriter();
         out.write(data);
     }
     public void doPost(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
            doGet(request,response);
     }
 }

這里有幾個小細節需要注意:
1. response.setCharacterEncoding("UTF-8");需要寫在PrintWriter out = response.getWriter();的前面。拿到字符流后再設置編碼是沒有用的。

2. response.setHeader("content-type", "text/html;charset=UTF-8");有一種更為簡單的寫法response.setContentType("text/html;charset=UTF-8");。

3.response.setContentType("text/html;charset=UTF-8");這句代碼其實有兩個作用:通知response以UTF-8輸出和瀏覽器以UTF-8打開。即等價于response.setHeader("content-type", "text/html;charset=UTF-8");和response.setCharacterEncoding("UTF-8");兩句代碼。

4.通過以上閱讀,讀者應該能明白為什么response.getOutputStream.write(1);這句代碼在瀏覽器的輸出不是1。因為瀏覽器是一個文本編輯器,收到數據后會拿著1去查碼表,然后顯示對應字符。想在瀏覽器輸出數字,應該把數字變成字符串,response.getOutputStream.write((1+"").getBytes());.

用OutputStream(字節流)發送數據:
1、response.getOutputStream().write(“中國”.getBytes());//以默認編碼發送數據
2、response.getOutputStream().write("中國".getBytes("UTF-8"));//以UTF-8編碼發送數據,瀏覽器(默認用GB2312)會出現亂碼

解決辦法:
2.1通過更改瀏覽器的編碼方式:IE/”查看”/”編碼”/”UTF-8”(不可取)
2.2通過設置響應頭告知客戶端編碼方式:response.setHeader(“Content-type”, “text/html;charset=UTF-8”);//告知瀏覽器數據類型及編碼
2.3通過meta標簽模擬請求頭:out.write("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />".getBytes());
2.4通過以下方法:response.setContentType("text/html;charset=UTF-8");

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性videos高清精品| 98精品国产自产在线观看| 国产精品视频一区二区高潮| 国产一区深夜福利| 久久精品国产2020观看福利| 亚洲福利视频二区| 国产综合福利在线| 亚洲国产欧美一区二区三区同亚洲| 欧美黄色片视频| 大荫蒂欧美视频另类xxxx| 精品成人av一区| 国内外成人免费激情在线视频| 久久久久久久久久久网站| 97视频在线免费观看| 在线观看日韩专区| 2018中文字幕一区二区三区| 欧美亚洲在线观看| 欧美日韩亚洲一区二区| 成人黄色免费看| 国产精品青青在线观看爽香蕉| 欧美在线观看网站| 日韩一区av在线| 亚洲人成欧美中文字幕| 欧美日韩福利视频| 在线成人免费网站| 一个人看的www欧美| 欧美特黄级在线| 国产97色在线| 神马久久久久久| 97视频在线观看播放| 91精品视频免费观看| 日本精品久久中文字幕佐佐木| 国产视频久久网| 97在线观看视频| 久久精品国产亚洲一区二区| 亚洲第一网站男人都懂| 日本成人激情视频| 国产精品自拍小视频| 欧美国产中文字幕| 亚洲精品720p| 青青久久av北条麻妃海外网| 日韩欧美亚洲一二三区| 亚洲精品有码在线| 亚洲美女av在线| 97色在线观看免费视频| 日韩欧美在线视频日韩欧美在线视频| 久久99精品视频一区97| 欧美在线观看网址综合| 色老头一区二区三区在线观看| 国产精品a久久久久久| 久久精品中文字幕免费mv| 欧美日韩性视频| 欧美成人午夜激情| 国产精品爱久久久久久久| 亚洲欧洲美洲在线综合| 国产精品久久久久久亚洲调教| 亚洲国产精品小视频| 精品国产区一区二区三区在线观看| 亚洲成av人片在线观看香蕉| 日韩黄色av网站| 久久精品成人欧美大片| 国产97在线|日韩| 国产日韩欧美夫妻视频在线观看| 欧美日韩另类视频| 国产精品自拍小视频| 91九色国产在线| 精品久久久久久亚洲精品| 亚州精品天堂中文字幕| 91国产精品电影| 国产精品18久久久久久麻辣| 亚洲a在线播放| 国产成人91久久精品| 亚洲欧美日韩成人| 中文字幕日韩av| 91国在线精品国内播放| 午夜免费久久久久| 一区二区成人av| 久久久之久亚州精品露出| 国产精品日韩在线一区| 日韩美女在线观看| 日韩麻豆第一页| 免费91麻豆精品国产自产在线观看| 国产精品久久久久久av| 日韩在线观看电影| 日韩大陆欧美高清视频区| 欧美激情精品久久久久| 成人欧美一区二区三区黑人| 国产精品午夜国产小视频| 51午夜精品视频| 在线观看精品自拍私拍| 91久久在线观看| 97婷婷涩涩精品一区| 日韩极品精品视频免费观看| 久久精品国产成人| 欧美与欧洲交xxxx免费观看| 亚洲无av在线中文字幕| 成人黄色网免费| 色噜噜国产精品视频一区二区| 国产一区二区三区在线播放免费观看| 亚洲女同精品视频| 亚洲日韩欧美视频| 欲色天天网综合久久| 狠狠久久亚洲欧美专区| 欧美激情一级欧美精品| 国内精品400部情侣激情| 欧美精品少妇videofree| 91精品综合久久久久久五月天| 久久久av亚洲男天堂| 欧美激情喷水视频| 日韩视频永久免费观看| 亚洲精品网站在线播放gif| 国产日韩欧美电影在线观看| 亚洲va欧美va国产综合久久| 夜夜躁日日躁狠狠久久88av| 成人免费网站在线观看| 国产精品白丝jk喷水视频一区| 日韩电影网在线| 韩国福利视频一区| 欧美巨猛xxxx猛交黑人97人| 国产一区二区日韩精品欧美精品| 亚洲图中文字幕| 亚洲精品天天看| 久久综合88中文色鬼| 久久久久亚洲精品国产| 久久久国产成人精品| 8090成年在线看片午夜| 国产精品国产三级国产aⅴ9色| 久久国产一区二区三区| 91av在线播放| 欧美成人精品一区二区| 狠狠躁夜夜躁久久躁别揉| 亚洲精品美女在线观看播放| 久久精品91久久久久久再现| 欧美高清一级大片| 欧美俄罗斯乱妇| 日韩美女在线观看一区| 国产精品户外野外| 成人黄色在线观看| 激情成人中文字幕| 欧美激情亚洲视频| 国产精品久久久久久久久久东京| 姬川优奈aav一区二区| 国产亚洲成av人片在线观看桃| 欧美日韩在线免费| 久久免费视频网站| 欧美视频专区一二在线观看| 国产在线观看不卡| 亚洲欧美制服中文字幕| 亚洲片在线观看| 欧美视频中文在线看| 国产精品一区二区久久久| 久久视频在线观看免费| 日韩中文在线不卡| 国产精品久久久91| 日韩毛片在线观看| 国产日韩精品在线播放| 国产精品久久久久久av| 国产综合视频在线观看| 91av在线播放视频| 国产成人小视频在线观看| 91日本在线视频| 欧美一级黄色网| 日韩免费av一区二区| 在线播放国产一区中文字幕剧情欧美|