Servlet相关的几种乱码

1. 页面中文显示乱码

原因: response中的内容会先输入到response缓冲区,然后再输入到传给浏览器,所以要将缓冲区和浏览器的编码都设置成utf-8
1)未使用jsp,而是在servlet设置response输入内容中存在中文

  • 解决方案: 在response.getWriter()输出内容之前加上下面两行代码
response.setCharacterEncoding("UTF-8");// 设置缓冲区编码
response.setContentType("text/html;charset=UTF-8");// 设置浏览器编码 

2)使用了jsp

  • 解决方案: 在jsp头部写上如下代码:
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

2.request乱码问题(在请求参数中带有中文)

原因:

  • 浏览器传输参数时使用的是ISO-8859-1编码不支持中文
  • 高版本tomcat中的新特性:就是严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])

解决方案:

  • 先将获取的参数用ISO-8859-1解码成二进制流,然后再用utf-8进行编码,代码如下:
String usernameString = new String(username.getBytes("ISO-8859-1"),"UTF-8");// username为获取的参数
  • 对于post请求还可以使用如下方法  
request.setCharacterEncoding("utf-8");
  • 对于高版本的tomcat,在修改tomcat目录下的conf/catalina.properties中,找到最后注释掉的一行#
#tomcat.util.http.parser.HttpParser.requestTargetAllow=| 

去除#并改成

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}

表示把{}放行

3.设置附件下载时中文名没有了

原因: 不同浏览器会对附件的文件名进行解码 解决方案: 争对不同浏览器进行编码,代码如下:

// 获取客户端信息
String agent = request.getHeader("User-Agent");
// 定义一个变量记录编码之后的名字
String filenameEncoder = "";// 新附件的文件名,用于传给浏览器
if (agent.contains("MSIE")) {
	// IE编码
	filenameEncoder = URLEncoder.encode(filename, "utf-8");  // filename 是原附件的文件名
	filenameEncoder = filenameEncoder.replace("+", " ");
} else if (agent.contains("Firefox")) {
	// 火狐编码
	BASE64Encoder base64Encoder = new BASE64Encoder();
	filenameEncoder = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";// filename 是原附件的文件名
} else {
	// 浏览器编码
	filenameEncoder = URLEncoder.encode(filename, "utf-8");// filename 是原附件的文件名
}

posted @ 2019-07-18 10:56  沐堇  阅读(166)  评论(0编辑  收藏  举报