Code Bye

response 字符集的 一个怪事

 


如图,怪事,有人知道原因吗

图一中设字符集生效,但如果进入到图二中的方法后,再设就不生效了。
注:图一中的方法ActionUtil.responseJson,就是调的图二中的方法。
有人在没??

15分
你把设置字符集那句话放在得到writer之前试一试呢?

10分
引用 3 楼 zy353003874 的回复:

你把设置字符集那句话放在得到writer之前试一试呢?

楼上说的有道理,你在设置回应编码前已经获取了writer,故writer还是默认编码的writer


15分
你需要了解  http 的工作过程,也需要知道 servlet 怎么处理 http 协议的。

在 Java 中,InputStream/OutputStream 是字节流,不涉及字符集,但 Reader / Writer 是字符流,它涉及到字符集的,而在 Servlet 中当我们拿 getWriter() 时就是用 ResponseContext 中的 Content Type 中设定的字符集的,因此你拿了writer 之后再来设置 Content Type 是没有意义的,也是不应该这样做的,对于某些服务器还可能在这种情况下报告一个 IllegalStateException 提示你这样做是弄错了办事流程。

我知道原因了,你把PrintWriter out = resp.getWriter();resp.setContentType(“text/html;charset=utf-8”);这两句话对调,一个是出现乱码,一个是没有乱码。
补充刚才上面说的。这里我截取了一段为什么这两句话不能交换。这是从API文档给出的
 setContentType

void setContentType(java.lang.String type)

    Sets the content type of the response being sent to the client, if the response has not been committed yet. The given content type may include a character encoding specification, for example, text/html;charset=UTF-8. The response””s character encoding is only set from the given content type if this method is called before getWriter is called. 

准确, http 在开始向 socket 写入回复的时候,就不能再改变这些像 http 头,content type 这些东西了,开始写回复就是已经 committed 了。

想改任何 http header 的内容,请在准备写出  response 之前做。

引用 7 楼 u010559460 的回复:

补充刚才上面说的。这里我截取了一段为什么这两句话不能交换。这是从API文档给出的
 setContentType

void setContentType(java.lang.String type)

    Sets the content type of the response being sent to the client, if the response has not been committed yet. The given content type may include a character encoding specification, for example, text/html;charset=UTF-8. The response””s character encoding is only set from the given content type if this method is called before getWriter is called. 


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明response 字符集的 一个怪事