`

servlet的输出乱码 分析PrintWriter

阅读更多
servlet的输出:

  两种方式:用response得到输出流即 response.getOuptStream();
           返回值为ServletOutputStream 对象,即JSP的out对 象
             要么用response得到输出对象PrintWriter即response.getWriter()
   
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {    
    PrintWriter pw = response.getWriter();    
    response.setCharacterEncoding("utf-8");    
    response.setContentType("text/html; charset=utf-8");    
    pw.print("中文");    
}   
 

这个输出是乱码。
为什么呢?已经设置了字符编码啊。

难道设置的无效。

在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.

就是讲,在返回一个PrintWriter对象的时候,charactor encoding就已经确定了,就已经设置好了字符集了。

什么时候设置的呢?
setCharacterEncoding方法的实现时发现如下代码:
public void setCharacterEncoding(String charset) {    
   
        if (isCommitted())    
            return;    
            
        // Ignore any call from an included servlet    
        if (included)    
            return;         
            
        // Ignore any call made after the getWriter has been invoked    
        // The default should be used    
        if (usingWriter)    
            return;    
   
        coyoteResponse.setCharacterEncoding(charset);    
        isCharacterEncodingSet = true;    
    }  


其中usingWriter 标志为getPrinteWriter方法中设定,可见其控制逻辑为一旦返回了PrintWriter,本函数即不再生效


ServletOutputStream out = response.getOutputStream();   
out.print("中文");   
           
//情况1:正常,浏览器按utf-8方式查看   
//response.setContentType("text/html; charset=utf-8");   
           
//情况2:浏览器缺省按简体中文查看,手动设为utf-8方式查看正常   
//response.setCharacterEncoding("utf-8");  
说明:这种方式不仅不需要在调用getOutputStream()之前设定字符集,甚至在print输出后设定都有效



引用
1.在servlet中输出中文,如果采用PrintWriter方式,需要在调用getPrintWriter()之前调用setContentType 或者 setCharacterEncoding;采用ServletOutputStream方式,不受此限。
2.setContentType 和 setCharacterEncoding两方法中设定characterEncoding的方法对服务器效果一致,不需要反复调用。在输出文本内容时,采用response.setContentType("text/html; charset=utf-8");似乎更为方便。






--------------------------------------------------------
读写文件时乱码解决:
http://www.java1995.cn/article/655.html
1
0
分享到:
评论

相关推荐

    servlet输出JS乱码问题

    知识点:Servlet输出JS乱码问题解析与解决方案 一、Servlet与JS输出背景 Servlet是Java Web应用中的核心组件,主要用于处理客户端发送的HTTP请求,并生成响应。在Web开发中,Servlet经常被用来处理业务逻辑,然后...

    servlet输出中文乱码问题

    4. **输出流编码设置问题**:在Servlet中使用`PrintWriter`或`OutputStream`输出数据时,如果没有正确地设置输出流的字符编码,同样会导致乱码。 #### 三、解决方案详解 根据以上分析,我们可以通过以下步骤来解决...

    Servlet 中文乱码问题

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

    Servlet输出中文乱码的新收获

    Servlet 输出中文乱码的解决方法 在本文中,我们将讨论 Servlet 输出中文乱码的问题,并提供解决方法。首先,让我们了解一下问题的来源。在 Servlet 中,输出中文乱码的问题经常会出现,导致浏览器显示的中文字符...

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

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

    【servlet】彻底解决doGet、doPost以及控制台中文乱码问题

    1. 应答乱码处理(response输出页面时乱码) 1.1 问题: 输出到页面时中文会乱码 后端代码: PrintWriter out = response.getWriter(); out.println(你好,世界!); 前端显示: 1.2 原因 没有设置...

    完美解决在Servlet中出现一个输出中文乱码的问题

    在Servlet开发过程中,输出中文字符时经常遇到乱码问题,这主要是由于字符编码不一致导致的。本篇文章将深入解析如何在Servlet中完美解决中文乱码问题,并提供具体解决方案。 首先,我们需要理解Java Servlet处理...

    解决jsp+servlet开发中的中文乱码问题

    ### 解决JSP+Servlet开发中的中文乱码问题 #### 概述 在基于JSP(Java Server Pages)和Servlet技术的Java Web应用开发过程中,中文乱码问题一直是困扰开发者的一大难题。由于Java Web应用程序涉及多个组件之间的...

    Java servlet 使用 PrintWriter 时的编码与乱码的示例代码

    然而,处理编码问题时,PrintWriter的行为可能会导致乱码,特别是在处理非ASCII字符(如中文字符)时。 首先,我们需要了解PrintWriter的默认编码。当没有明确指定编码时,PrintWriter并不会使用`Charset.default...

    JSP页面中文乱码几个解决办法

    当Servlet在浏览器中显示内容时出现乱码,需要在Servlet中调整输出响应的编码。使用`response.setContentType("text/html;charset=GBK")`,这样可以设定响应内容的编码为GBK,确保浏览器能正确解析中文内容。特别是...

    servlet编写、部署、运行全过程

    在`doGet`方法中,我们设置了响应的类型为HTML,并使用`PrintWriter`对象向客户端输出了一个日期。 3. **处理字符编码**:在设置响应类型时,可以指定字符编码,以避免中文乱码问题。 4. **错误处理**:在处理请求...

    JAVA 乱码问题集合

    例如,代码`new PrintWriter(new OutputStreamWriter(resp.getOutputStream(), "utf-8"))`就是设置输出流的编码为UTF-8,以解决返回中文时可能出现的乱码问题。这里的`utf-8`是关键,它应与浏览器期望的编码一致。 ...

    JSP乱码 N种解决方案

    - 确保错误日志的编码设置正确,同时在使用`System.out.println()`或`PrintWriter`时,也要注意指定合适的编码。 15. **监控和调试** - 使用工具如Fiddler、Chrome开发者工具等,可以查看HTTP头信息,检查字符...

    JSP在Servlet中的几个编码的作用及原理

    当Servlet生成动态内容时,可以使用`PrintWriter`或`OutputStream`输出到响应流。在使用`PrintWriter`时,应确保它与响应内容类型设置的字符集一致,否则可能会出现编码问题。 6. **文件上传**: 在处理文件上传...

    java web开发解决乱码问题

    ##### 4.1 Servlet生命周期与乱码问题的关系 - **初始化阶段**:首次请求时,Servlet会被初始化一次,此时可设置字符集编码。 - **处理请求阶段**:每个请求调用`service`方法,其中会调用`doGet`或`doPost`方法。...

    乱码问题解决

    本文将深入探讨如何在Servlet环境中解决乱码问题,确保数据正确无误地传输和显示。 ### Servlet中的乱码问题 #### 1. **理解字符编码** 在深入解决方案之前,首先需要了解字符编码的基本概念。字符编码是将字符...

    中文乱码解决方法(已验证).docx

    例如,在Servlet中,当使用`OutputStream`或`PrintWriter`输出中文字符串时,由于编码和解码的不匹配,可能导致乱码。 三、response中文乱码 1. 解决方法一:`response.setCharacterEncoding("UTF-8")`用于设置响应...

    JSP乱码解方案.doc

    使用`PrintWriter`或`OutputStreamWriter`进行输出,可以确保字符编码的正确转换。 4. **URL编码**:GET或POST请求中的汉字可能会导致乱码,因为SUN的J2SDK在解析参数时未考虑浏览器的编码设置。为解决这个问题,...

Global site tag (gtag.js) - Google Analytics