又碰到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. ??
说明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. if (isCommitted())
  3. return;
  4. // Ignore any call from an included servlet
  5. if (included)
  6. return;
  7. // Ignore any call made after the getWriter has been invoked
  8. // The default should be used
  9. if (usingWriter)
  10. return;
  11. coyoteResponse.setCharacterEncoding(charset);
  12. isCharacterEncodingSet = true;
  13. }
 其中usingWriter 标志为getPrinteWriter方法中设定,可见其控制逻辑为一旦返回了PrintWriter,本函数即不再生效。但是上述的推断没有进一步的证据。
同时我们发现只有usingWriter标志,却没有usingOutputStream标记。猜测使用ServletOutputStream 输出不受此限制,经测试写出如下代码。
java 代码
  1. ServletOutputStream out = response.getOutputStream();
  2. out.print("中文");
  3. //情况1:正常,浏览器按utf-8方式查看
  4. //response.setContentType("text/html; charset=utf-8");
  5. //情况2:浏览器缺省按简体中文查看,手动设为utf-8方式查看正常
  6. //response.setCharacterEncoding("utf-8");
 说明:这种方式不仅不需要在调用getOutputStream()之前设定字符集,甚至在print输出后设定都有效。
(居然有字数限制,并且提示都没有,内容就丢了,郁闷。只好分两篇了,待续)

转载于:https://blog.51cto.com/nanhaochen/47081

Servlet 输出中文乱码的新收获(1)相关推荐

  1. java生成html乱码_java向html输出中文乱码解决方法

    java向html输出中文乱码根本原因就是编码不一致的问题,所以解决方式就是设置编码的方式. 其中,还分为字节流和字符流的解决方式 字节流:response.setHeader("Conte ...

  2. 编码(ACSII unicod UTF-8)、QT输出中文乱码深入分析

    总结: 1. qt输出中文乱码原因分析 qt的编程环境默认是utf-8编码格式(关于编码见下文知识要点一): cout << "中文" << endl; 程 ...

  3. PHP输出中文乱码的解决方法

    PHP输出中文乱码的解决方法 参考文章: (1)PHP输出中文乱码的解决方法 (2)https://www.cnblogs.com/cyun/p/4146131.html 备忘一下.

  4. 解决Vs输出中文乱码的问题

    解决Vs输出中文乱码的问题 原文:https://blog.csdn.net/c_khalid/article/details/51515675 源程序的运行结果是:中文乱码 首先,这个与VS本身无关 ...

  5. jquery PHP 中文乱码,PHP输出中文乱码怎么解决?

    在建立网站的时候我们会发现,php页面输出乱码,php输出数据库字段也乱码,这要怎么解决?下面本篇文章就来给大家介绍一下解决php输出中文乱码的方法,希望对你们有所帮助. 第一种.HTML和PHP混合 ...

  6. qt5.13.2输出中文乱码

    qt5使用qDebug()输出中文乱码,可以在.pro文件中添加以下的代码: #解决中文编译没法通过,输出中文乱码 msvc {QMAKE_CFLAGS += /utf-8QMAKE_CXXFLAGS ...

  7. asp.net core输出中文乱码的问题

    原文:asp.net core输出中文乱码的问题 摘要 在学习asp.net core的时候,尝试在控制台,或者页面上输出中文,会出现乱码的问题. 问题重现 新建控制台和站点 public class ...

  8. VScode输出中文乱码的解决方法------测试过可以用

    VScode输出中文乱码的解决方法------测试过可以用 参考文章: (1)VScode输出中文乱码的解决方法------测试过可以用 (2)https://www.cnblogs.com/shou ...

  9. php打印出来乱码_PHP输出中文乱码怎么解决?

    在建立网站的时候我们会发现,php页面输出乱码,php输出数据库字段也乱码,这要怎么解决?下面本篇文章就来给大家介绍一下解决php输出中文乱码的方法,希望对你们有所帮助. 第一种.HTML和PHP混合 ...

最新文章

  1. hdu4909 状态压缩(偶数字符子串)
  2. 判断程序是否处于调试状态
  3. 线段树优化的Dijkstra
  4. mysql语句随机数_程序生成随机数与SQL语句生成随机数
  5. 查看欧拉系统服务器ip,euler os 查看center进程命令
  6. (57)Verilog HDL选择运算符:?
  7. 机器学习算法总结之Bagging与随机森林
  8. 在技术社区以外的博文中插入代码(把代码转换到 Html 文本)
  9. pfSense修改mbuf值
  10. markdown快速创建表格及内容工具
  11. fp16和fp32,神经网络混合精度训练,PYTORCH 采用FP16,Libtorch采用FP16,神经网络混合精度三种避免损失,TensorRT模型转换及部署(一)
  12. Hrbust 1522 利用队列求最大子序列的和
  13. VMare Workstation 12 安装 AsteriskNow freePBX
  14. JSP标签,jsp:include,jsp:forward用法介绍及示例
  15. Cannot locate a 64-bit Oracle Client library:The specified module could not be found.
  16. Chess.com:象棋社区网站每月访问量达 2.8 亿,年收入在 5000 万至 1 亿之间
  17. QML调用Android摄像头,并将每一帧传入C++进行处理(QML 对象,转化为C++对象)
  18. 内存分析工具LeakCanary是如何工作的
  19. GO Strings-and-runes
  20. clickhouse建表异常 DB::Exception: No macro ‘shard‘ in config

热门文章

  1. 计算机安全防范系统维护,安防系统维护与设备维修(全彩)
  2. java窗口添加标签页_在新标签页中打开新窗口
  3. oracle sql2000,sql2000的代码改成oracle的
  4. GitHub改为token验证后,如何提交代码?
  5. (盒子模型常见问题)外边距合并问题,嵌套盒子边距塌陷问题解决
  6. python的自定义异常类,带参Exception,多个except,断言语句,断点,try...except,try...except...else,try...except...finally处理
  7. android ril.java_Android RIL的java框架
  8. java settings文件夹_JAVA工具例大全--Setting文件读取配置参数
  9. 20200814:力扣201周周赛题解记录上
  10. (补)20200105:整数转罗马数字