javaweb文字乱码

输出结果中文乱码怎么解决


<%@ page contentType="text/html; charset=GB2312"%>
<html>
  <head>
    <title>input.jsp</title>
  </head>
  <body>
    <h1>用户登录</h1>
    <form action="userservlet" method="post">
        姓名:
      <input type="text" id="name" name="name" required><br>
        年龄:
      <input type="number" id="age" name="age" required><br>
      <input type="submit" value="提交"><br>
    </form>
  </body>
</html>


<%@ page contentType="text/html; charset=GB2312"%>
<%@ page import="com.user" %>
<html>
  <head>
    <title>show.jsp</title>
  </head>
  <body>
<% user u=(user)session.getAttribute("user"); %>
登录成功<hr>
姓名:<% out.println(u.getName());%> 
年龄:<% out.println(u.getAge());
%>
  </body>
</html>

package com;

public class user {
    String name;
    int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public boolean isLogin(){
        if(name != null && age>0 && age<150){
            return true;
        }else{
        return false;}
    }
}


package com;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class userservlet extends HttpServlet {

    public void destroy() {
        super.destroy();
    }


        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          try{
            String name = request.getParameter("name");
            Integer age = Integer.parseInt(request.getParameter("age"));
            user u=new user();
            u.setAge(age);
            u.setName(name);
            HttpSession session=request.getSession(true);
            
            if(u.isLogin()){
                session.setAttribute("user", u);
                response.sendRedirect("show.jsp");
            }else{
                response.sendRedirect("input.jsp");
            }
          }
          
          catch(NumberFormatException e){
              response.sendRedirect("input.jsp");
            }
            }

        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);

        }


        public void init() throws ServletException {
            // Put your code here
        }

}

img

img

该回答引用GPT4:乱码问题可能是因为在处理请求和响应时,字符编码不一致导致的。为了解决这个问题,您可以尝试以下方法:

  1. 首先,将您的页面编码统一更改为 UTF-8,这是一种更通用的字符编码。将以下代码中的 GB2312 替换为 UTF-8:
<%@ page contentType="text/html; charset=UTF-8"%>
  1. userservletdoGetdoPost 方法中,分别添加以下代码,以设置请求和响应的字符编码为 UTF-8:
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");

例如,将 doGet 方法修改为:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    response.setCharacterEncoding("UTF-8");
    try {
        String name = request.getParameter("name");
        Integer age = Integer.parseInt(request.getParameter("age"));
        user u = new user();
        u.setAge(age);
        u.setName(name);
        HttpSession session = request.getSession(true);

        if (u.isLogin()) {
            session.setAttribute("user", u);
            response.sendRedirect("show.jsp");
        } else {
            response.sendRedirect("input.jsp");
        }
    } catch (NumberFormatException e) {
        response.sendRedirect("input.jsp");
    }
}
  1. 如果仍然出现乱码问题,可以尝试在 web.xml 文件中添加以下配置,以设置默认的字符编码为 UTF-8:
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

注意:如果您的项目中没有使用 Spring 框架,您可能需要自定义一个字符编码过滤器类来替换 org.springframework.web.filter.CharacterEncodingFilter

经过上述修改后,您的项目应该能够正确处理中文字符,避免乱码问题。

userservlet 中设置
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");

两种方式
1.换成post请求方式
2.在传输的时候先encode然后decode

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7508923
  • 这篇博客你也可以参考下:javaweb插入数据库内容出现乱码或无法输出中文内容
  • 您还可以看一下 Gardener老师的Javaweb商城项目实战篇课程中的 后台管理系统页面小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    解决javaweb输出中文乱码问题的方法和步骤如下:

    1. 设置响应消息头中contentType的charset为UTF-8
    response.setContentType("text/html;charset=UTF-8");
    
    1. 获取输出流之前,设置响应对象的字符集
    response.setCharacterEncoding("UTF-8");
    
    1. 确认Tomcat服务器的URI编码也是UTF-8

    打开eclipse中要修改的项目 -> Servers -> Tomcat v7.0 Server at localhost-config -> 打开server.xml -> 添加URIEncoding=“UTF-8”属性。

    <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
    

    注:以上步骤依次进行即可解决问题。另外,在输出中文时,建议使用字符流(PrintWriter)或字节流(ServletOutputStream)输出,同时注意字符集的设置。