`
laowang
  • 浏览: 37505 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Servlet 输出中文乱码的新收获(1)

    博客分类:
  • Java
阅读更多

又碰到servlet 输出中文乱码的问题,恼火。研究了一下,有了新的发现和认识。

原始代码:

java 代码
  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {   
  2.     PrintWriter pw = response.getWriter();   
  3.     response.setCharacterEncoding("utf-8");   
  4.     response.setContentType("text/html; charset=utf-8");   
  5.     pw.print("中文");   
  6. }  

 无论把3、4两句改成gbk还是utf-8,页面访问到的一律是??

一怒之下用wpe抓包,发现无论设为utf-8还是gbk抓到的均为

HTTP 代码
  1. HTTP/1.1 200 OK   
  2. Server: Apache-Coyote/1.1  
  3. Content-Type: text/html;charset=ISO-8859-1  
  4. Content-Length: 2  
  5. Date: Thu, 08 Mar 2007 06:04:55 GMT   
  6.   
  7. ??  

说明3、4两句没起作用,检查代码,尝试把2和三四顺序调整,乱码问题解决。

检查api文档,发现说明如下

 PrintWriter getWriter()  throws IOException

Returns a PrintWriter object that can send character text to the client. The PrintWriter uses the character encoding returned by getCharacterEncoding(). If the response's character encoding has not been specified as described in getCharacterEncoding (i.e., the method just returns the default value ISO-8859-1), getWriter updates it to ISO-8859-1.   

推断getWriter()返回的PrintWriter使用的charactor encoding是在这个函数返回时即已确定的,但到底是返回的PrintWriter内部属性还是运行时的控制,未找到依据。

查看 tomcat中setCharacterEncoding方法的实现时发现如下代码:

java 代码
  1. public void setCharacterEncoding(String charset) {   
  2.   
  3.         if (isCommitted())   
  4.             return;   
  5.            
  6.         // Ignore any call from an included servlet   
  7.         if (included)   
  8.             return;        
  9.            
  10.         // Ignore any call made after the getWriter has been invoked   
  11.         // The default should be used   
  12.         if (usingWriter)   
  13.             return;   
  14.   
  15.         coyoteResponse.setCharacterEncoding(charset);   
  16.         isCharacterEncodingSet = true;   
  17.     }  

 其中usingWriter 标志为getPrinteWriter方法中设定,可见其控制逻辑为一旦返回了PrintWriter,本函数即不再生效。但是上述的推断没有进一步的证据。

同时我们发现只有usingWriter标志,却没有usingOutputStream标记。猜测使用ServletOutputStream 输出不受此限制,经测试写出如下代码。

java 代码
  1. ServletOutputStream out = response.getOutputStream();   
  2. out.print("中文");   
  3.            
  4. //情况1:正常,浏览器按utf-8方式查看   
  5. //response.setContentType("text/html; charset=utf-8");   
  6.            
  7. //情况2:浏览器缺省按简体中文查看,手动设为utf-8方式查看正常   
  8. //response.setCharacterEncoding("utf-8");  

 说明:这种方式不仅不需要在调用getOutputStream()之前设定字符集,甚至在print输出后设定都有效。

(居然有字数限制,并且提示都没有,内容就丢了,郁闷。只好分两篇了,待续)

分享到:
评论

相关推荐

    servlet输出JS乱码问题

    当Servlet需要输出JS代码,尤其是包含中文字符时,可能会遇到乱码问题。这主要是因为浏览器和服务器之间存在编码不一致的情况。在默认情况下,Servlet容器会使用ISO-8859-1编码来处理HTTP请求和响应,而这个编码并不...

    servlet输出中文乱码问题

    ### servlet输出中文乱码问题详解 #### 一、问题背景 在进行Web开发时,特别是使用Java Servlet处理HTTP请求的过程中,经常会遇到输出中文字符时出现乱码的问题。这不仅会影响用户体验,还会对项目的正常运行造成...

    Servlet输出中文乱码的新收获

    1. Servlet 输出中文乱码的问题是由于字符编码不正确引起的。 2. PrintWriter 的工作机制是将字符文本发送到客户端,并使用 getCharacterEncoding() 方法返回的字符编码。 3. ServletOutputStream 不受字符编码的...

    servlet与jsp中文乱码处理

    下面将详细阐述servlet和jsp中文乱码的处理方式。 1. **理解编码基础** - **Unicode**:全球统一的字符编码标准,包含了世界上几乎所有的字符。 - **UTF-8**:最常用的Unicode编码方式,它以字节为单位进行编码,...

    JSP_利用Filter解决Servlet输出中文乱码的问题.docx

    JSP_利用Filter解决Servlet输出中文乱码的问题主要涉及以下几个核心知识点: 1. **Filter接口**:`javax.servlet.Filter`是Java Servlet API中的一部分,它提供了一种在请求到达目标Servlet或JSP之前对其进行拦截并...

    Java Servlet输出中文乱码问题解决方案

    Java Servlet 输出中文乱码问题解决方案 Java Servlet 中文乱码问题是 Web 开发中常见的问题之一,解决这个问题需要了解浏览器和服务器的编码格式保持一致的重要性。在本文中,我们将通过示例代码来详细介绍 Java ...

    Servlet 中文乱码问题

    当使用`PrintWriter`输出中文字符串时,如果没有设置正确的字符编码,浏览器可能会按照ISO-8859-1编码解码,导致无法识别中文字符,出现乱码。此时,应通过`response.setCharacterEncoding("GB2312")`或相应的编码...

    jsp传参 servlet接收中文乱码问题的解决方法.docx

    jsp 传参 servlet 接收中文乱码问题的解决方法 jsp 传参 servlet 接收中文乱码问题是一个经常遇到的问题,特别是在使用 Hibernate+Servlet 框架时。当我们在 jsp 页面传参到 servlet 时,中文字符经常会出现乱码...

    jsp+servlet+mysql乱码解决的这天

    jsp+servlet+mysql乱码解决方案是指在使用jsp+servlet+mysql开发web应用程序时,如何解决中文乱码问题的解决方案。该方案通过设置每个页面的编码格式为utf-8,控制器servlet中的请求编码格式为utf-8,数据库连接url...

    servlet中文乱码问题

    ### Servlet + Tomcat 中文乱码问题解析及解决方案 #### 一、中文乱码问题概述 在使用Servlet和Tomcat进行Web开发时,经常会遇到中文乱码的问题。这主要是因为客户端(如浏览器)与服务器之间使用的字符编码不一致...

    servlet乱码及解决

    这是servlet出现乱码,以及乱码出现时的解决办法。

    servlet中解决乱码

    这些数据默认情况下是以ISO-8859-1编码处理的,这可能导致非ASCII字符(如中文、日文等)被错误地解码。 要解决乱码问题,我们有以下策略: 1. **请求参数乱码**:当通过GET或POST方式传递参数时,我们需要设置...

    解决servlet页面乱码问题

    1. **HTTP请求乱码**:在处理POST请求时,如果请求参数是非ASCII字符,需要确保Servlet正确解析它们。可以通过以下方式设置请求编码: ```java request.setCharacterEncoding("UTF-8"); ``` 这行代码应尽早放...

    解决servlet中文乱码问题1

    解决servlet中文乱码问题1 在servlet编程中,中文乱码问题是常见的困扰,但是通过正确的配置和编码设置,可以轻松地解决这个问题。 标题解释 解决servlet中文乱码问题1的标题指的是,如何在servlet应用程序中正确...

    Servlet 中文乱码解决工具类

    虽然浏览器提交的请求使用的是中文编码格式UTF-8,但经过业务处理中的ISO-8859-1编码,仍然会出现中文乱码现象。解决此问题的方法非常简单,在业务处理中重新指定中文字符集进行编码即可解决。在实际的开发过程中,...

    Jsp和Servlet中文乱码问题

    本文将深入探讨JSP和Servlet中文乱码问题的根源、解决方案以及预防策略。 ### JSP和Servlet中的中文乱码问题根源 中文乱码问题通常源于字符编码不一致或配置错误。在Web应用中,数据流经多个环节,包括客户端...

    Servlet中的中文乱码问题

    本篇文章将深入探讨如何解决Servlet中的中文乱码问题,以及如何在GBK、UTF-8和ISO-8859-1之间做出合理的选择。 首先,我们需要了解字符编码的基本概念。GBK是中国大陆广泛使用的中文字符集,包含了大部分中文字符;...

    servlet过滤器解决乱码问题

    ### Servlet过滤器解决乱码问题 在Web应用开发过程中,字符编码问题经常出现,尤其是在处理中文等多字节字符时。如果不正确地设置字符编码,可能会导致页面显示乱码。本文将详细介绍如何通过Servlet过滤器来解决这...

    Struts2和servlet的中文乱码问题

    在Web开发中,尤其是使用Struts2和Servlet框架时,中文乱码问题是一个常见的困扰。本文将详细解析如何解决这两个框架中的中文乱码问题。 首先,我们来看Struts2的情况。在处理中文乱码时,主要涉及到两种HTTP请求...

    ajax到servlet乱码解决

    例如,我们使用 AJAX 通过 URL 传递中文参数 "中文测试" 给 Servlet,Servlet 在接收参数时却变成了乱码 "�������"。这使得我们的应用程序无法正确地处理中文参数。 解决方案 要解决这个问题,我们可以从两...

Global site tag (gtag.js) - Google Analytics