在JAVA的学习过程中,我们可能会遇到乱码问题,其中有4种常见的乱码现象:
(1)在Servlet中获得通过get方式传递到服务器的数据时出现乱码;
(2)在Servlet中获得通过post方式传递到服务器的数据时出现乱码;
(3)Servlet通过服务器将数据响应到客户端时出现乱码;
(4)HTML或JSP页面在客户端展示时出现的乱码情况。

针对这几种情况的解决办法如下:

首先我们要了解,出现乱码问题的原因是因为我们在浏览器、服务器和开发工具这三者或两者之间的编码方式未保持一致,导致在其中一个地方编写的汉字不能在其他地方正常显示,在一般情况下,浏览器的编码方式是GBK,服务器为ISO8859-1,开发者工具由自己设定为了UTF-8。了解了这些,我们可以试着去想,为了解决乱码问题,我们就需要让数据在不同的地方都统一按照UTF-8方式展示。

1、GET方式

public class RegistServlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        String name = req.getParameter("userName");
        byte[] bytes = name.getBytes("ISO8859-1");
        String newName = new String(bytes,"UTF-8");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req, resp);
    }
}

解析:在doGet方法中定义一个name变量获得封装在服务器的客户端数据userName,然后将name以“ISO8859-1”的方式赋值给字节数组bytes,最后将此bytes数组以UTF-8的方式赋值给一个新创建的String变量newName,此时newName就是能正常显示的数据,之所以这么麻烦,是因为没有直接的办法一行代码解决,可以就当此方法为固定用法。

2、POST方式

public class RegistServlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        //注意:post方式提交数据的乱码解决方式,放在getParameXXX方法之前
        req.setCharacterEncoding("UTF-8");
        //得到前台input框中name="username"和password="password"的value值
        String username = req.getParameter("username");
        String password = req.getParameter("password");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req, resp);
    }
}

解析:post传递方式下解决乱码问题很简单,就req.setCharacterEncoding(“UTF-8”); 这一行代码,但需注意,要将这句话放在获取数据之前。

3、响应对象的乱码解决

public class RegistServlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        //方式一:
        resp.setContentType("text/html;charset=utf-8");
        //方式二:
        resp.setHeader("Content-type", "text/html");
        resp.setCharacterEncoding("UTF-8");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req, resp);
    }
}

解析:注意,以上两种方法在应用时要写在输出方法之前,另外,两种方式效果一样,因为方式一较简洁,常用方式一。

4、Html或者jsp页面乱码

<head>
        <meta charset="UTF-8">
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
        <title>form表单</title>
</head>

解析:两个meta标签开头的作用效果一样,都可以使用,任选其一就可。