一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - JavaEE中用response向客戶端輸出中文數據亂碼問題分析

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

2019-12-02 14:42hebedich JAVA教程

這篇文章主要介紹了JavaEE中用response向客戶端輸出中文數據亂碼問題分析,需要的朋友可以參考下

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時的測試結果:

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

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

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

  為了讓我們的網站能被國外用戶訪問,我們在將字符數據變成字節數據時,要指定轉換的碼表為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");

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美人体高清在线观看ggogo | 1717国产精品视频免费 | 好吊色青青青国产综合在线观看 | 秋霞宅宅236理论片 秋霞一级黄色片 | 激情综 | 国内精品久久久久久野外 | 99热这里有免费国产精品 | chinesexxxx高中生gay | 亚洲精品国精品久久99热 | 欧美一区二区三区精品国产 | 免费亚洲视频在线观看 | 公翁的舌尖研磨她的花蒂小说 | 91小视频在线观看免费版高清 | 日本在线视频播放 | 俄罗斯海滩厕所偷窥 | 高考录取率1977-2021 | 国产小视频在线免费 | 毛片一级毛片 | 大学生特黄特色大片免费播放 | 国产一级在线免费观看 | 国产一区二区三区丶四区 | 美女校花被调教出奶水 | 亚洲国产精品网站久久 | 四虎影院永久网站 | 日本96在线精品视频免费观看 | 亚洲国产99在线精品一区二区 | 涩色爱 | 爱爱亚洲 | 亚洲国产精品嫩草影院久久 | 全黄h全肉细节修仙玄幻文 全彩调教侵犯h本子全彩妖气he | 亚洲精品www久久久久久 | 黑白配高清hd在线视频 | 国产一卡2卡3卡四卡精品网站 | 国产成人无精品久久久久国语 | 三级无删减高清在线影院 | 4虎影视国产在线观看精品 4s4s4s4s色大众影视 | 国产亚洲精品高清在线 | 久久99国产亚洲高清观着 | 二区三区不卡不卡视频 | 精选国产AV精选一区二区三区 | 日本一在线中文字幕天堂 |