在获取request请求参数时,我们经常会用到getParameter()这个方法,但是在获取参数时我们会遇到中文乱码的问题,如下图;
处理这个问题首先我们要确定我们所使用的请求方式是POST还是GET.
1.如果我们使用的是POST那这个问题就很容易解决了,因为POST的底层使用的是getReader()的方式来获取一个字符输入流,而tomcat获取这个流时使用的编码是ISO_8859_1;所以读中文数据时会乱码,这时我们就只需要将tomcat获取这个流时的编码换成UTF-8即可解决,
这时我们仅仅使用req.setCharacterEncoding("UTF-8");这一行代码来改变流的字符集就可以解决post方式请求中文乱码的问题,如下图
2.1.如果我们使用的是GET,那首先我们就要知道GET请求获取参数的方法是什么:在GET请求方式的底层使用的是getQueryString()方法来获取参数的,该方法在获取参数时会将中文字符通过url编码的方式先转换为二进制,然后再将每个字节转换为2个16进制数并在其前面加上%,编码了自然就需要解码,解码的过程是Tomcat来进行的url解码,此时Tomcat使用的字符集为ISO-8859-1;
就是上述原因造成了GET请求方式的中文乱码
那么,为了解决这个问题,就需要
1.对乱码数据进行编码:转换为字节数组;
byte[] bytes=username.getBytes(StandardCharsets,ISO-8859-1);
2.对字节数组解码:
username=new String(bytes,StandarCharsets,UTF-8);
这样我们的中文字符就不会乱码了.
所有代码如下:
package com.mc;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
@WebServlet("/req8")
public class RequestDemo8 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
System.out.println("解决乱码前:"+username);
System.out.println(username);
username = new String(username.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
System.out.println("解决乱码后:"+username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
this.doGet(req, resp);
}
}