• Java Web开发中的乱码问题


    POST方法乱码:

    1:存在乱码的示例:

    前端页面:

    <%@ page language="java" contentType="text/html; charset=UTF-8" //设置UTF8编码
        pageEncoding="UTF-8"%>
    <%
        String path = request.getContextPath();
        String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
                + path + "/";
    %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <!-- 头作用,告诉浏览器UTF8编码 -->
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <base href="<%=basePath%>">
    <title>Insert title here</title>
    </head>
    <body>
        <div align="center">
            <form action="Encode" method="post">
                Name:<input name="name" type="text" /> <br> Sex:<input
                    type="text" name="sex" /><br>
                <button type="submit">发送</button>
            </form>
        </div>
    
    
    </body>
    </html>

    后台Servlet接受参数:

    package com.daxin;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class Encode
     */
    public class Encode extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request, response);
            
        }
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            
            //默认编码是ISO8859-1
            String name = request.getParameter("name");
            String sex = request.getParameter("sex");
            System.out.println(name);
            System.out.println(sex);
    
        }
    
    }

    当我们启动输入中文时候,打印的是:

    ?¤§é??
    ??·

    乱码,这个问题的原因就是:Servlet的方法的所有方法默认解码都是ISO-8859-1,而我们前端页面编码是UTF8,所以导致解码乱码!这种方式也存在解决方案:

        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            
            //默认编码是ISO8859-1
            String name = request.getParameter("name");
            String sex = request.getParameter("sex");
            
            System.out.println(name);
            System.out.println(sex);
    
            //由于上面是ISO编码错误,所以还原之后再使用UTF8编码
            String newName = new String(name.getBytes("ISO-8859-1"),"UTF-8");
            String newSex = new String(sex.getBytes("ISO-8859-1"),"UTF-8");
            
            System.out.println(newName);
            System.out.println(newSex);
            
        }

    第二种更优解决方案:设置全局的UTF-8编码

        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            
            //全局设置UTF8编码,该方法只对实体内容中的数据起作用。post的数据是实体内容中的。所以该设置只对post起作用。get方法不起作用
            request.setCharacterEncoding("UTF-8");
            //默认编码是ISO8859-1
            String name = request.getParameter("name");
            String sex = request.getParameter("sex");
            
            System.out.println(name);
            System.out.println(sex);
    }

    GET乱码问题:

    由于request.setCharacterEncoding("UTF-8");方法只对实体内容编码起作用,换言之就是只对Post有效,对于GET方法请求依旧无法生效。所以针对Get请求我们只能手动解码:

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            //默认编码是ISO8859-1
            String name = request.getParameter("name");
            String sex = request.getParameter("sex");
            //由于上面是ISO编码错误,所以还原之后再使用UTF8编码
            String newName = new String(name.getBytes("ISO-8859-1"),"UTF-8");
            String newSex = new String(sex.getBytes("ISO-8859-1"),"UTF-8");
            
            System.out.println(newName);
            System.out.println(newSex);
            
        }

    但是通常我们一般都只是实现一个Post方法逻辑,而是将GET请求逻辑转给Post处理,所以此时比较健全的写法是:

    package com.daxin;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class Encode
     */
    public class Encode extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doPost(request, response);
    
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            // 全局设置UTF8编码,该方法只对实体内容中的数据起作用。post的数据是实体内容中的
            request.setCharacterEncoding("UTF-8");
            // 默认编码是ISO8859-1
            String name = request.getParameter("name");
            String sex = request.getParameter("sex");
            if ("GET".equals(request.getMethod())) {
                name = new String(name.getBytes("ISO-8859-1"), "UTF-8");
            }
    
            if ("GET".equals(request.getMethod())) {
                sex = new String(sex.getBytes("ISO-8859-1"), "UTF-8");
            }
    
            System.out.println(name);
            System.out.println(sex);
    
        }
    
    }

    结论:乱码问题出现,就是因为编码和解码时候使用的不是一个编码,最终导致乱码。所以解决问题的核心思路就是使用同一个编码解码器。前端一般使用的是UTF8编码,后台默认是ISO8859-1,所以我们将后台解码器使用UTF8即可解决编码问题。

  • 相关阅读:
    springboot +mybatis 使用PageHelper实现分页,并带条件模糊查询
    jQuery设置点击选中样式,onmouseover和onmouseout事件
    Ajax跨域设置
    Java获取文章的上一篇/下一篇
    Python str / bytes / unicode 区别详解
    Python bytes 和 string 相互转换
    Python bytearray/bytes/string区别
    Python eval 与 exec 函数区别
    Python eval 与 exec 函数
    Python set list dict tuple 区别和相互转换
  • 原文地址:https://www.cnblogs.com/leodaxin/p/7510862.html
Copyright © 2020-2023  润新知