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

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页