response.setCharacterEncoding(charset)是设置服务器发送响应数据的编码,还是设置浏览器接收服务器响应数据后解码用的那个码(这

adnap7 2018-12-07 02:11:46
最近看编码的问题看得头大了,网上的帖子一人一个说法,看java文档,我也没弄清
1.response.setCharacterEncoding(charset)是设置服务器发送响应数据的编码,还是设置浏览器接收服务器响应数据后解码用的那个码(这两个是不同的概念)?比如下面这位老哥说的(原贴链接:http://www.cnblogs.com/xdouby/p/8308915.html),他前面说response.setCharacterEncoding()是设置服务器响应数据的编码,然后说response.setContentType(“text/html;charset=utf-8”); 设置浏览器对服务器响应数据的解码,但他之中调用了response.setCharacterEncoding(),(这是java文档中说的,在getWriter()之前调用就能起到这个效果)就不用写response.setCharacterEncoding了。这里问题就来了,他前面说response.setCharacterEncoding是设置服务器数据输出编码的,response.setContentType怎么设置浏览器解码的?有没有人说说到底是怎么回事,谁设置编码,谁设置解码?
引用
所以在使用response.getWriter()发送数据之前,一定要设置response.getWriter()的编码,这需要使用response.setCharacterEncoding()方法:

response.setCharacterEncoding(“utf-8”);
response.getWriter().print(“传智”);
上面代码因为在使用response.getWriter()输出之前已经设置了编码,所以输出的数据为utf-8编码。但是,因为没有告诉浏览器使用什么编码来读取响应数据,所以很可能浏览器会出现错误的解读,那么还是会出现乱码的。当然,通常浏览器都支持来设置当前页面的编码,如果用户在看到编码时,去设置浏览器的编码,如果设置的正确那么乱码就会消失。但是我们不能让用户总去自己设置编码,而且应该直接通知浏览器,服务器发送过来的数据是什么编码,这样浏览器就直接使用服务器告诉他的编码来解读!这需要使用content-type响应头。

  response.setContentType(“text/html;charset=utf-8”);
  response.getWriter().print(“传智”);
上面代码使用setContentType()方法设置了响应头content-type编码为utf-8,这不只是在响应中添加了响应头,还等于调用了一次response.setCharacterEncoding(“utf-8”),也就是说,通过我们只需要调用一次response.setContentType(“text/html;charset=utf-8”)即可,而无需再去调用response.setCharacterEncoding(“utf-8”)了。

2.request.setCharacterEncoding:是设置服务器对浏览器发送过来数据的解码格式对吧
3.response.setHeader("content-type", "text/html;charset=字符编码");等于response.setContentType(“text/html;charset=utf-8”); 吗? 一样在getWriter()之前执行的话就有response.setCharacterEncoding(“utf-8”); 的效果吗?
能说出几个问题答案就说几个,希望能够帮我解答疑惑
...全文
977 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
桔子214032 2019-01-04
  • 打赏
  • 举报
回复
想请问一下在tomcat9环境下,调用response.setCharacterEncoding("UTF-8"),html文件中的中文都乱码了,不调用response.setCharacterEncoding这个方法设置编码可以正常显示,请问楼主有这个情况吗?
adnap7 2018-12-16
  • 打赏
  • 举报
回复
并没有得到很准确的答案,我感觉这个人的文章还不错,https://blog.csdn.net/j080624/article/details/55271961 https://blog.csdn.net/J080624/article/details/55264947,可以参考一下 结贴了
低调的JVM 2018-12-07
  • 打赏
  • 举报
回复
你发送请求的时候也有contentTypt,这个header才是发送请求的内容的格式,而不是浏览器设置的格式
adnap7 2018-12-07
  • 打赏
  • 举报
回复
引用 6 楼 jjb_hz 的回复:
有些时候前端页面使用的是UTF-8的编码格式,那么浏览器使用utf-8来解析,但是你返回的数据的格式是gbk,同一个页面下不能用两种编码来解析,所以会出现数据乱码问题
浏览器编码格式是用于向服务器输出用的,解码格式才是解析服务器响应数据用的,这两个不同没事的吧。应该看服务器输出数据编码格式和浏览器解码格式是否一致才是导致乱码的原因吧
低调的JVM 2018-12-07
  • 打赏
  • 举报
回复
有些时候前端页面使用的是UTF-8的编码格式,那么浏览器使用utf-8来解析,但是你返回的数据的格式是gbk,同一个页面下不能用两种编码来解析,所以会出现数据乱码问题
低调的JVM 2018-12-07
  • 打赏
  • 举报
回复
你百度下如何设置浏览器编码格式,很多浏览器都支持自动检测,也就是检测页面或者返回数据的编码格式来动态的切换解析时使用的编码格式
adnap7 2018-12-07
  • 打赏
  • 举报
回复
引用 3 楼 jjb_hz 的回复:
第一题:response只能设置相应的内容相关东西,不能设置浏览器的编码,当浏览器的解析渲染时所用的编码格式和response的contentType的charset一致时,就能正常解析出来数据,否则出现乱码。比如你可以百度下如何设置浏览器编码 第二题:是的 第三题:有效果
你的意思是response.setCharacterEncoding()是设置服务器数据输出的编码是吗?网上搜了多是说response.setContentType通知浏览器以什么样的格去解码响应数据啊,那应该怎么通知浏览器以UTF-8解码呢?
低调的JVM 2018-12-07
  • 打赏
  • 举报
回复
第一题:response只能设置相应的内容相关东西,不能设置浏览器的编码,当浏览器的解析渲染时所用的编码格式和response的contentType的charset一致时,就能正常解析出来数据,否则出现乱码。比如你可以百度下如何设置浏览器编码

第二题:是的

第三题:有效果
adnap7 2018-12-07
  • 打赏
  • 举报
回复
引用 1 楼 jjb_hz 的回复:
contentType是指body的内容格式,比如xml,json等; characterEncoding指的是body的编码格式,比如utf-8,gbk等。 setCharacterEncoding(...) 方法设置的编码格式最终会追加到contentType这个key的值上,比如 "Content-Type"= "text/html;charset=utf-8”。 也就是说在设置contentType的同时,也可以设置内容的编码格式。 如果未设置编码格式,比如setContentType("text/html"),那么可以通过setCharacterEncoding("utf-8") 方法来追加。 contentType对应的就是header里的一个Content-Type,就是一个键值对,http协议规定了很多键值对,每个键值对起不同的作用,感兴趣的可以看下http协议的报文格式和常见header的参数设置。
那么response.setCharacterEncoding("UTF-8")和contentType="text/html;charset=UTF-8"设置的是我题目中的哪一种编码呢?
低调的JVM 2018-12-07
  • 打赏
  • 举报
回复
contentType是指body的内容格式,比如xml,json等;

characterEncoding指的是body的编码格式,比如utf-8,gbk等。
setCharacterEncoding(...) 方法设置的编码格式最终会追加到contentType这个key的值上,比如 "Content-Type"= "text/html;charset=utf-8”。

也就是说在设置contentType的同时,也可以设置内容的编码格式。
如果未设置编码格式,比如setContentType("text/html"),那么可以通过setCharacterEncoding("utf-8") 方法来追加。

contentType对应的就是header里的一个Content-Type,就是一个键值对,http协议规定了很多键值对,每个键值对起不同的作用,感兴趣的可以看下http协议的报文格式和常见header的参数设置。

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧