欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

  Web服務(wù)器收到客戶端的http請(qǐng)求,會(huì)針對(duì)每一次請(qǐng)求,分別創(chuàng)建一個(gè)用于代表請(qǐng)求的request對(duì)象,和代表響應(yīng)的response對(duì)象。request和response對(duì)象既然代表請(qǐng)求和響應(yīng),那我們要獲取客戶機(jī)提交過(guò)來(lái)的數(shù)據(jù),只需要找request對(duì)象就行了。要向客戶機(jī)輸出數(shù)據(jù),只需要找response對(duì)象就行了。

復(fù)制代碼 代碼如下:

 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;
 //輸出中文的問(wèn)題
 public class ResponseDemo extends HttpServlet {
     public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         String data = "中國(guó)";
         OutputStream out = response.getOutputStream();
         out.write(data.getBytes());
         /**
          *     out.write(data.getBytes());這句代碼涉及兩次查閱碼表。
          *    "中國(guó)"從字符數(shù)據(jù)變成字節(jié)數(shù)據(jù)的時(shí)候,會(huì)查閱gb2312碼表。
          *    數(shù)據(jù)發(fā)送到瀏覽器端要顯示的時(shí)候,需要再次查閱碼表,這時(shí)查閱的碼表與瀏覽器的設(shè)置有關(guān)。
          */
         }
     public void doPost(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
            doGet(request,response);
     }
 }

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

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

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

復(fù)制代碼 代碼如下:

 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;
 //輸出中文的問(wèn)題
 public class ResponseDemo extends HttpServlet {
     public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         //在服務(wù)器端,數(shù)據(jù)是以哪個(gè)碼表輸出的,那么就要控制瀏覽器以哪個(gè)碼表打開。
         String data = "中國(guó)";
         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);
     }
 }

 多學(xué)一招:

使用HTML語(yǔ)言里面的<meta>標(biāo)簽來(lái)控制瀏覽器行為。

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

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

復(fù)制代碼 代碼如下:

 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;
 //輸出中文的問(wèn)題
 public class ResponseDemo extends HttpServlet {
     public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         //在服務(wù)器端,數(shù)據(jù)是以哪個(gè)碼表輸出的,那么就要控制瀏覽器以哪個(gè)碼表打開。
         String data = "中國(guó)";
         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);
     }
 }

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

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

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

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

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

解決辦法:
2.1通過(guò)更改瀏覽器的編碼方式:IE/”查看”/”編碼”/”UTF-8”(不可取)
2.2通過(guò)設(shè)置響應(yīng)頭告知客戶端編碼方式:response.setHeader(“Content-type”, “text/html;charset=UTF-8”);//告知瀏覽器數(shù)據(jù)類型及編碼
2.3通過(guò)meta標(biāo)簽?zāi)M請(qǐng)求頭:out.write("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />".getBytes());
2.4通過(guò)以下方法:response.setContentType("text/html;charset=UTF-8");

相關(guān)文章

  • Java切割字符串的踩坑實(shí)戰(zhàn)記錄

    Java切割字符串的踩坑實(shí)戰(zhàn)記錄

    最近在項(xiàng)目中使用了java中的分割字符串,踩了一個(gè)坑,充分了展示了自己對(duì)java底層的認(rèn)知有很多的不足和欠缺,下面這篇文章主要給大家介紹了關(guān)于Java切割字符串的踩坑實(shí)戰(zhàn)記錄,需要的朋友可以參考下
    2022-11-11
  • IDEA控制臺(tái)日志中文亂碼解決方案(好用!)

    IDEA控制臺(tái)日志中文亂碼解決方案(好用!)

    這篇文章主要給大家介紹了關(guān)于IDEA控制臺(tái)日志中文亂碼解決的相關(guān)資料,平常的開發(fā)中,我們通常會(huì)用到日志打印進(jìn)行開發(fā),文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • 一文帶你學(xué)會(huì)Java網(wǎng)絡(luò)編程

    一文帶你學(xué)會(huì)Java網(wǎng)絡(luò)編程

    網(wǎng)絡(luò)編程是指編寫運(yùn)行在多個(gè)設(shè)備(計(jì)算機(jī))的程序,這些設(shè)備都通過(guò)網(wǎng)絡(luò)連接起來(lái)。這篇文章將帶大家深入了解一下Java的網(wǎng)絡(luò)編程,需要的可以了解一下
    2022-08-08
  • 解析WeakHashMap與HashMap的區(qū)別詳解

    解析WeakHashMap與HashMap的區(qū)別詳解

    本篇文章是對(duì)WeakHashMap與HashMap的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Spring?Boot教程之提高開發(fā)效率必備工具lombok

    Spring?Boot教程之提高開發(fā)效率必備工具lombok

    這篇文章主要介紹了Spring?Boot教程之提高開發(fā)效率必備工具lombok的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • Java讀取OpenSSL生成的PEM公鑰文件操作

    Java讀取OpenSSL生成的PEM公鑰文件操作

    這篇文章主要介紹了Java讀取OpenSSL生成的PEM公鑰文件操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • SpringBoot3.0整合chatGPT的完整步驟

    SpringBoot3.0整合chatGPT的完整步驟

    ChatGPT是OpenAI推出的一個(gè)語(yǔ)言模型系統(tǒng),它能夠?qū)崟r(shí)回答用戶提問(wèn),包括聊天、糾正語(yǔ)法錯(cuò)誤,甚至是寫代碼、寫劇本等,由于可玩性很高,迅速在全球范圍內(nèi)風(fēng)靡起來(lái),下面這篇文章主要給大家介紹了關(guān)于SpringBoot3.0整合chatGPT的完整步驟,需要的朋友可以參考下
    2022-12-12
  • Spring Data中domain模塊的使用

    Spring Data中domain模塊的使用

    Spring Data是一個(gè)流行的數(shù)據(jù)訪問(wèn)框架,本文主要介紹了Spring Data中domain模塊的使用,并展示如何使用它來(lái)優(yōu)化我們的數(shù)據(jù)訪問(wèn)層,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • idea使用easyCode生成代碼(根據(jù)mybatis-plus模板創(chuàng)建自己的模板)

    idea使用easyCode生成代碼(根據(jù)mybatis-plus模板創(chuàng)建自己的模板)

    本文主要介紹了idea使用easyCode生成代碼,easyCode代碼生成器可以減少低價(jià)值搬磚,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • JAVA對(duì)象clone方法代碼實(shí)例解析

    JAVA對(duì)象clone方法代碼實(shí)例解析

    這篇文章主要介紹了JAVA對(duì)象clone方法代碼實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評(píng)論