用response得到输出流,即response.getOuptStream(); 返回值为ServletOutputStream 对象,即JSP的out对象,要么用response得到输出对象PrintWriter即response.getWriter()。

Java代码

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("中文");

}

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中找到方法说明:

Java代码

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 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方法的实现时发现如下代码:

Java代码

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;

}

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输出后设定都有效。

///情况三:在tomcat的server.xml中找到Connector的位置,并添加URIEncoding="UTF-8:

结论:

1.在servlet中输出中文,如果采用PrintWriter方式,需要在调用getPrintWriter()之前调用setContentType 或者 setCharacterEncoding;采用ServletOutputStream方式,不受此限。

2.setContentType 和 setCharacterEncoding两方法中设定characterEncoding的方法对服务器效果一致,不需要反复调用。在输出文本内容时,采用response.setContentType("text/html; charset=utf-8");似乎更为方便。

3.PrintWriter自身并没有处理编码的职责,它还是应该看成一个装饰器比较好:它就是为了输出更方便而设计的,提供print、println、printf等便利方法。要设置编码的话,可以在它的底层Writer上设置:(这里以OutputStreamWriter为底层Writer),参考:

Java代码

new PrintWriter(new OutputStreamWriter(new FileOutputStream("yourfilepath"), "UTF-8"));

new PrintWriter(new OutputStreamWriter(new FileOutputStream("yourfilepath"), "UTF-8"));

java printwriter乱码_PrintWriter返回乱码的分析及解决相关推荐

  1. JAVA 编程中的汉字处理(1)---java 编程技术中汉子问题的分析与解决

    Java 编程技术中汉字问题的分析及解决 段明辉, 自由撰稿人 简介: 在基于 Java 语言的编程中,我们经常碰到汉字的处理及显示的问题.一大堆看不懂的乱码肯定不是我们愿意看到的显示效果,怎样才能够 ...

  2. aliyun oss 文件上传 java.net.SocketTimeoutException Read timed out 问题分析及解决

    aliyun oss 文件上传 java.net.SocketTimeoutException Read timed out 问题分析及解决 参考文章: (1)aliyun oss 文件上传 java ...

  3. java应用 cpu占用过高问题分析及解决方法

    主要介绍了java应用cpu占用过高问题分析及解决方法,具有一定参考价值,需要的朋友可以参考下. 使用jstack分析java程序cpu占用率过高的问题 1,使用jps查找出java进程的pid,如3 ...

  4. Java中常见的CMS GC问题分析与解决(一)

    Java中常见的CMS GC问题分析与解决(一) 目前,互联网上 Java 的 GC 资料要么是主要讲解理论,要么就是针对单一场景的 GC 问题进行了剖析,对整个体系总结的资料少之又少.前车之鉴,后事 ...

  5. Windows服务器java.exe占用CPU过高问题分析及解决

    原文路径:https://blog.csdn.net/ningzuobei/article/details/48828915 最近在测试一个用java语言实现的数据采集接口时发现,接口一旦运行起来,C ...

  6. java printwriter实例_PrintWriter做过滤流+FileWriter案例分析

    package com.mstf.ui; import java.io.*; public class TestWriter { public static void main(String args ...

  7. java printwriter 文件_PrintWriter未写入文件(Java)

    我正在编写一种自动提款机程序,该程序会将数据输出到文件中(是​​的,我知道它不是英语,但这不是重点),并且遇到了错误. 当我尝试使用PrintWriter它不起作用时,我不知道为什么. public ...

  8. 用Java刷OJ超时怎么办?原因分析及解决方式

    Java超时原因? 又是Java超时. PAT不给Java延时,简直欺负Java选手.因为Java本身底层的一些原因,编译.运行起来会比其他语言慢一些.有很多其他OJ都放宽Java时间限制了. 以后除 ...

  9. JAVA 代码交互率低的原因分析,深入剖析Java编程中的中文问题及建议最优解决方法...

    说明:本文为作者原创,作者联系地址为: josserchai@yahoo.com .由于 Java 编程中的中文 问题是一个老生常谈的问题,在阅读了许多关于 Java 中文问题解决方法之后,结合作者的 ...

最新文章

  1. 南京林业大学计算机专升本,2018江苏专转本学校之:南京林业大学
  2. VMware vSphere 7 服务器ESXi虚拟化HA高可用解决方案
  3. 负载均衡实现,一个域名对应多个IP地址
  4. hadoop学习1 java操作HDFS
  5. 6、控件样式模板和使用
  6. objective-C 的内存管理之-引用计数
  7. html中横线中间加字_干货|学术论文中的“三线表”如何绘制?
  8. 转载:XPath基本语法
  9. 直击前沿技术:云原生应用低代码开发平台实践
  10. MySQL工具【mysql 客户端连接工具】
  11. centos6下的vsftpd配置
  12. 批量修改excel表格的名字(无需编程经验)
  13. 金盘系统无法连接服务器,西数金盘Gold系列主要面向企业级服务器及存储系统...
  14. 浅谈企业IT技术运营中台
  15. autojs图片加水印
  16. HTB Devel[Hack The Box HTB靶场]writeup系列3
  17. centos7 查看内存使用
  18. Android自定义控件--仿安全卫士中的一键加速【圆形进度条】
  19. Ubuntu学习笔记6-ESP32接收并处理cmd_vel话题
  20. 倍福PLC:win7专业版系统安装TwinCAT3后图标灰色,报错0x426 starting TwinCAT system

热门文章

  1. Mybatis延时加载
  2. 51-DS1302实时时钟
  3. 单片机c语言ds1302,STC单片机控制DS1302 (1TMCU C程序)
  4. ARMv7,ARM7,ARMA7有什么区别
  5. 张爱玲的最新经典爱情语句
  6. 任务管理器被管理员禁用_为什么禁用任务管理器?
  7. c 语言 vk_return,GetAsyncKeyState(VK_RETURN)遇到
  8. 那些令程序员泪流满面的瞬间
  9. 走过的路,做过的事——我的2014
  10. Docker容器间的网络通信