servlet中解决中文乱码问题

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型

最早的HTTP协议中,并没有附加的数据类型信息,所有传送的数据都被客户程序解释为超文本标记语言HTML 文档,而为了支持多媒体数据类型,HTTP协议中就使用了附加在文档之前的MIME数据类型信息来标识数据类型。常用的MIME类型由两部分组成:前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。

例如:

  • 超文本标记语言文本 .html text/html
  • xml文档 .xml text/xml
  • XHTML文档 .xhtml application/xhtml+xml
  • PNG图像 .png image/png

为什么要了解MIME?

由于MIME类型与文档的后缀相关,因此服务器使用文档的后缀来区分不同文件的MIME类型,服务器中必须定义文档后缀和MIME类型之间的对应关系。而客户程序从服务器上接收数据的时候,它只是从服务器接受数据流,并不了解文档的名字,因此服务器必须使用附加信息来告诉客户程序数据的MIME类型。服务器在发送真正的数据之前,就要先发送标志数据的MIME类型的信息,这个信息使用Content-type关键字进行定义,例如对于HTML文档,服务器将首先发送以下两行MIME标识信息,这个标识并不是真正的数据文件的一部分。

Content-type: text/html

导致中文乱码的原因

首先,我们了解一下什么是ServletResponse: 辅助 servlet 将响应发送到客户端的对象;
然后,我们输入一下代码在get方法中:

response.getWriter().append("你好");

这句代码的意思是:是发送 MIME 正文响应中的字符数据”你好”.
如果不加任何代码,这个时候浏览器应该是”??”,原因是如果未指定 charset,则将默认使用 ISO-8859-1。而ISO-8859-1没有对应的中文编码,所以这个时候就无法显示我们的中文字了。

java EE api中写道:

可使用 #setCharacterEncoding 和 #setContentType 显式指定 MIME 正文响应的 charset,或使用 #setLocale 方法隐式指定它。显式指定优先于隐式指定。如果未指定 charset,则将使用 ISO-8859-1。setCharacterEncoding、setContentType 或 setLocale 方法必须在调用 getWriter 之前,并且必须在提交采用要使用的字符编码的响应之前调用.

解决浏览器显示乱码的方法

response.setCharacterEncoding("utf-8");
response.setHeader("content-type", "text/html");//不加可能会出错

或者:

response.setContentType("text/html;charset=utf-8");

如果是从浏览器请求数据,比如把浏览器上的数据输出到控制台出现乱码:

request.setCharacterEncoding("utf-8");

更多文章请看:woshisomeone.github.io

  • 1
    点赞
  • 2
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论

打赏作者

woshisomeone

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值