文档章节

Servlet 输出中文乱码的新收获

 大东家
发布于 2015/01/13 10:28
字数 604
阅读 15
收藏 0

src:http://nanhaochen.blog.51cto.com/228629/47081

又碰到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标记。猜测使用<a title="class" in="" javax.servlet"="" href="file:///D:/dev/Java/java_ee_sdk-5_0_01-javadocs/docs/api/javax/servlet/ServletOutputStream.html" style="padding: 0px; margin: 0px; color: rgb(1, 95, 145); text-decoration: none;">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输出后设定都有效。
(居然有字数限制,并且提示都没有,内容就丢了,郁闷。只好分两篇了,待续)

本文转载自:http://blog.csdn.net/xiaohelong2005/article/details/19078667

粉丝 22
博文 257
码字总数 112112
作品 0
长沙
项目经理
私信 提问
jsp简介

Jsp简介 JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计和...

晨曦之光
2012/05/16
299
0
jsf开发心得(1)-jsf配置web.xml的url-pattern时出现乱码的怪事

又是郁闷的一天!!! 汗!搞jsf应用居然打开html文件的时候居然中文出现乱码!!! 怀疑是html文件的charset=UTF-8保存的时候保存为其他的编码了,但是保存文件应该是根据这个编码保存的啊。...

覃勇铖
2013/02/28
262
0
解决中文乱码问题

在基于JAVA的编程中,经常会碰到汉字的处里及显示的问题,比如一大堆乱码或问号。这是因为JAVA中默认的编码方式是UNICODE,而中国人通常使用的文件和DB都是基于GB2312或者BIG5等编码,故会出...

风吹鸡蛋壳
2009/05/19
9.9K
5
jsp、servlet中文乱码终极解决方法

jsp中文乱码终极解决方法 一 找出问题的根源 乱码可能出现的地方:1 jsp页面中 2 jsp页面之间相互传参的参数 3 与数据库中数据的存取 基本归纳为以上几种。 二 寻找解决方案 1 出现在jsp页面...

长平狐
2012/11/12
480
0
JSP表单提交中文时出现乱码

一、JSP页面显示乱码 下面的显示页面(display.jsp)就出现乱码: JSP的中文处理 <% out.print("JSP的中文处理"); %> 对 不同的WEB服务器和不同的JDK版本,处理结果就不一样。原因:服务器使用...

xiaodaiyy11
2011/11/17
4K
2

没有更多内容

加载失败,请刷新页面

加载更多

Linux 运行shell文件,出现 $'\r': command not found

运行编写的shell脚本时,出现了 $'\\r': command not found 这样的错误提示。 报错的原因是我们在windows系统操作时,编辑器里的换行符是\r\n ,而Linux上为\n,两个系统之间有差异导致的。 ...

芥末无敌
今天
7
0
Java数据结构(上)

枚举(Enumeration) 位集合(BitSet) 向量(Vector) 栈(Stack) 1.Enumeration(枚举) boolean hasMoreElements( ):测试是否有更多的元素 Object nextElement( ):如果此枚举对象至少还...

Firefly-
昨天
11
0
vue 跨层组件通讯 provide inject

https://cn.vuejs.org/v2/api/#provide-inject 类型: provide:Object | () => Object inject:Array<string> | { [key: string]: string | Symbol | Object } 详细: provide 和 inject 主......

阿豪boy
昨天
7
0
黑马程序员面试宝典(Java)Beta6.0免费下载

场景 JavaSE基础 面向对象特征以及理解 访问权限修饰符区别 理解clone对象 JavaSE语法 java有没有goto语句 &和&&的区别 如何跳出当前的多重嵌套循环? 是否可以继承String? 重载与重写的区别...

badaoliumang
昨天
9
0
监控linux系统状态

查看系统负载: w/uptime 最后面三个数字表示1分钟,5分钟,15分钟平均有多少个进程占用CPU 占用CPU的进程可以是Running,也可以是Waiting 某一时刻1颗CPU只能有一个进程在使用其资源 #查看c...

asnfuy
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部