最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaEE中用response向客戶端輸出中文數(shù)據(jù)亂碼問題分析

 更新時間:2014年10月26日 10:46:17   投稿:hebedich  
這篇文章主要介紹了JavaEE中用response向客戶端輸出中文數(shù)據(jù)亂碼問題分析,需要的朋友可以參考下

  Web服務(wù)器收到客戶端的http請求,會針對每一次請求,分別創(chuàng)建一個用于代表請求的request對象,和代表響應的response對象。request和response對象既然代表請求和響應,那我們要獲取客戶機提交過來的數(shù)據(jù),只需要找request對象就行了。要向客戶機輸出數(shù)據(jù),只需要找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());這句代碼涉及兩次查閱碼表。
          *    "中國"從字符數(shù)據(jù)變成字節(jié)數(shù)據(jù)的時候,會查閱gb2312碼表。
          *    數(shù)據(jù)發(fā)送到瀏覽器端要顯示的時候,需要再次查閱碼表,這時查閱的碼表與瀏覽器的設(shè)置有關(guān)。
          */
         }
     public void doPost(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
            doGet(request,response);
     }
 }

瀏覽器編碼設(shè)置為GB2312時的測試結(jié)果:

瀏覽器編碼設(shè)置為UTF-8時的測試結(jié)果:

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

復制代碼 代碼如下:

 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 {
         //在服務(wù)器端,數(shù)據(jù)是以哪個碼表輸出的,那么就要控制瀏覽器以哪個碼表打開。
         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的碼表打開。真正的響應頭優(yōu)先于用http-equiv模擬的響應頭。

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

復制代碼 代碼如下:

 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 {
         //在服務(wù)器端,數(shù)據(jù)是以哪個碼表輸出的,那么就要控制瀏覽器以哪個碼表打開。
         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);
     }
 }

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

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。因為瀏覽器是一個文本編輯器,收到數(shù)據(jù)后會拿著1去查碼表,然后顯示對應字符。想在瀏覽器輸出數(shù)字,應該把數(shù)字變成字符串,response.getOutputStream.write((1+"").getBytes());.

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

解決辦法:
2.1通過更改瀏覽器的編碼方式:IE/”查看”/”編碼”/”UTF-8”(不可取)
2.2通過設(shè)置響應頭告知客戶端編碼方式:response.setHeader(“Content-type”, “text/html;charset=UTF-8”);//告知瀏覽器數(shù)據(jù)類型及編碼
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");

相關(guān)文章

  • Java Web導出等比例圖片到Excel的實現(xiàn)過程

    Java Web導出等比例圖片到Excel的實現(xiàn)過程

    我們使用Java導出圖片到Excel,打開成功導出的Excel一看,商品對應的圖片都很規(guī)矩的按照我的設(shè)置鋪滿了整個單元格,但是,商品圖片卻都變形了,這樣肯定是不行的,于是第一反應就是將圖片等比例導出,所以本文本給大家介紹了如何使用Java Web導出等比例圖片到Excel
    2023-11-11
  • Mybatis中自定義TypeHandler處理枚舉的示例代碼

    Mybatis中自定義TypeHandler處理枚舉的示例代碼

    typeHandler,是 MyBatis 中的一個接口,用于處理數(shù)據(jù)庫中的特定數(shù)據(jù)類型,下面簡單介紹創(chuàng)建自定義 typeHandler 來處理枚舉類型的示例,感興趣的朋友跟隨小編一起看看吧
    2024-01-01
  • springboot配置druid連接池的方法示例

    springboot配置druid連接池的方法示例

    這篇文章主要介紹了springboot配置druid連接池的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Java基礎(chǔ)之反射

    Java基礎(chǔ)之反射

    JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;反射是框架設(shè)計的靈魂,感興趣的小伙伴可以參考閱讀
    2023-03-03
  • 詳解jeefast和Mybatis實現(xiàn)二級聯(lián)動的問題

    詳解jeefast和Mybatis實現(xiàn)二級聯(lián)動的問題

    這篇文章主要介紹了詳解jeefast和Mybatis實現(xiàn)二級聯(lián)動的問題,本文通過圖文實例相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • 通過實例了解Spring中@Profile的作用

    通過實例了解Spring中@Profile的作用

    這篇文章主要介紹了通過實例了解Spring中@Profile的作用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • 基于java HashMap插入重復Key值問題

    基于java HashMap插入重復Key值問題

    這篇文章主要介紹了基于java HashMap插入重復Key值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java一行代碼搞定耗時性能追蹤

    Java一行代碼搞定耗時性能追蹤

    在開發(fā)過程中,性能監(jiān)控和調(diào)試是我們經(jīng)常面對的問題,雖然市面上有許多成熟的性能監(jiān)控工具,但有時我們需要一個輕量級、靈活且優(yōu)雅的解決方案,下面我們就來看看Java如何搞定耗時性能追蹤吧
    2024-11-11
  • SpringBoot整合MybatisPlus的基本應用指南

    SpringBoot整合MybatisPlus的基本應用指南

    MyBatis-Plus ,簡稱 MP,是一個 MyBatis的增強工具,在 MyBatis 的基礎(chǔ)上只做增強不做改變,下面小編就來和大家介紹一下SpringBoot整合MybatisPlus的一些基本應用吧
    2025-03-03
  • SpringBoot啟動時自動執(zhí)行sql腳本的方法步驟

    SpringBoot啟動時自動執(zhí)行sql腳本的方法步驟

    本文主要介紹了SpringBoot啟動時自動執(zhí)行sql腳本的方法步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評論

哈尔滨市| 天水市| 名山县| 玉门市| 衡南县| 茌平县| 桑植县| 武汉市| 尼玛县| 那坡县| 高青县| 东乌| 丰宁| 富宁县| 长海县| 南通市| 石泉县| 长泰县| 沂源县| 仙桃市| 清徐县| 朝阳市| 西华县| 湘潭市| 南阳市| 宁津县| 遂溪县| 乌拉特前旗| 绥棱县| 泰兴市| 崇义县| 满洲里市| 邵阳市| 伊川县| 高邮市| 常熟市| 镇坪县| 武胜县| 会泽县| 保康县| 龙游县|