1 get请求request乱码
在Tomcat7及以下版本,客户端以UTF-8的编码传输数据到服务器端,而服务器端的request对象使用的是ISO8859-1这个字符编码来接收数据,服务器和客户端沟通的编码不一致因此才会产生中文乱码的。
解决办法:在接收到数据后,先获取request对象以ISo8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题。
Tomcat8的版本中get方式不会出现乱码了,因为服务器对url的编码格式可以进行自动转换。
tomcat8以下版本解决get中文乱码
String username = req.getParameter("username");
username = new String(username.getBytes("iso8859-1"), "utf-8");
2 post请求request乱码
在获取参数前设置setCharacterEncoding
为utf-8
req.setCharacterEncoding("UTF-8");
String username = req.getParameter("username");
3 response乱码
方式一:
resp.setCharacterEncoding("utf-8"); //设置 HttpServletResponse使用utf-8编码
resp.setHeader("Content-Type", "text/html;charset=utf-8"); //通知浏览器使用utf-8解码
方式二(优先使用):
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
riter.println("注册成功");
4 使用例子
package com.zjw;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/rs")
public class RegisterServlet extends HttpsServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
//tomcat8及以上版本不要使用转码,否则会乱码
// username = new String(username.getBytes("iso8859-1"), "utf-8");
String password = req.getParameter("password");
System.out.println(username + " " + password);
PrintWriter writer = resp.getWriter();
writer.println("注册成功");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决post中request中文乱码
req.setCharacterEncoding("UTF-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username + " " + password);
//响应给客户端
//解决response中文乱码
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.println("注册成功");
}
}