解决乱码

举报
兰舟千帆 发表于 2022/07/21 19:25:45 2022/07/21
【摘要】 解决乱码为什么会出现乱码一句话说明就是编码和解码的方式不一样。我们这个按照post提交的,get也一样,也会出现乱码。 解决post乱码==设置字符输入流的编码,设置的字符集要和页面保持一致==10 request.setCharacterEncoding(“UTF-8”);我们先测试一下能否解决post乱码的问题package jgd;import javax.servlet.Servl...

解决乱码

为什么会出现乱码
一句话说明就是编码和解码的方式不一样。
我们这个按照post提交的,get也一样,也会出现乱码。

解决post乱码

==设置字符输入流的编码,设置的字符集要和页面保持一致==

10 request.setCharacterEncoding(“UTF-8”);

我们先测试一下能否解决post乱码的问题

package jgd;

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.util.Map;
@WebServlet("/jgdabc00")
public class ServletDemo10 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doGet(req, resp);
//        Get请求逻辑
        System.out.println("get---");
        this.doPost(req,resp);
//
    }
//



    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post---");
//        获取所有参数的map集合
        req.setCharacterEncoding("UTF-8");
        Map<String, String[]> map = req.getParameterMap();
        String queryString = req.getQueryString();
        System.out.println(queryString);
        for (String key:map.keySet())
        {
            System.out.print(key+":");
            String[] values = map.get(key);
            //获取value
            for (String value:values)
                System.out.println(value+" ");

        }
//        根据key获取参数值,数组
        String[] hobbies = req.getParameterValues("hobby");
//        for(String hobby:hobbies){
//            System.out.println(hobby);
//        }
//        根据key获取单个参数值
        String password = req.getParameter("password");

        System.out.println(password);
//        等相同业务代码


    }
}

然后再次填写信息。获取数据。
成功获取到数据。

在这里插入图片描述

解决get请求乱码

==在进行编码和解码的时候,不管使用的是哪个字符集,他们对应的%E5%BC%A0%E4%B8%89 是一致的==

所以我们可以考虑把å¼ ä¸□ 转换成字节,在把字节转换成张三,在转换的过程中是它们的编码一致,就可以解决中文乱码问题。

1.按照ISO-8859-1编码获取乱码å¼ ä¸□ 对应的字节数组
2.按照UTF-8编码获取字节数组对应的字符串

演示代码

String username = "张三";
//1. URL编码
String encode = URLEncoder.encode(username, "utf-8");
System.out.println(encode);
//2. URL解码
String decode = URLDecoder.decode(encode, "ISO-8859-1");

System.out.println(decode); //此处打印的是对应的乱码数据

//3. 转换为字节数据,编码
byte[] bytes = decode.getBytes("ISO-8859-1");
for (byte b : bytes) {
System.out.print(b + " ");
}
//此处打印的是:-27 -68 -96 -28 -72 -119(十进制数字)
//4. 将字节数组转为字符串,解码
String s = new String(bytes, "utf-8");
System.out.println(s); //此处打印的是张三

value = new String(value.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);
完成两件事,首先转换为字节数组,然后解码,其实值转换为字符串。按照utf-8就可以。

来看代码

package jgd;

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;
import java.util.Map;

@WebServlet("/jgdabc00")
public class ServletDemo10 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doGet(req, resp);
//        Get请求逻辑
        System.out.println("get---");
        this.doPost(req, resp);
//
    }
//


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        System.out.println("post---");
//        获取所有参数的map集合
//        req.setCharacterEncoding("UTF-8");
        Map<String, String[]> map = req.getParameterMap();
        String queryString = req.getQueryString();
        System.out.println(queryString);
        for (String key : map.keySet()) {
            System.out.print(key + ":");
            String[] values = map.get(key);
            //获取value

            for (String value : values) {
                value = new String(value.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
                System.out.println(value);
            }

//            System.out.println(value + " ");

        }
//        根据key获取参数值,数组
        String[] hobbies = req.getParameterValues("hobby");
//        for(String hobby:hobbies){
//            System.out.println(hobby);
//        }
//        根据key获取单个参数值
        String password = req.getParameter("password");
        password = new String(password.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
        System.out.println(password);

        System.out.println(password);
//        等相同业务代码


    }
}

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。