image.png
    一个汉字在utf8中占3个字节,1个字节8位二进制码,
    底层的2进制的数据是一样的(也就是字节对应的二进制),乱码的内容, 所以转换成字节类型(用getBytes方法)
    // 3. 转换位字节数据
    // 使用getBytes方法,将字符串类型的数据转换为字节类型, 返回的是一个数组

    //将字节数组转换为字符串
    // 使用String构造方法转换: String res = new String(bytes, “UTF-8”)

    image.png

    1. package com.itheima.web;
    2. import javax.servlet.*;
    3. import javax.servlet.http.*;
    4. import javax.servlet.annotation.*;
    5. import java.io.IOException;
    6. import java.nio.charset.StandardCharsets;
    7. /**
    8. * 中文乱码问题解决方案
    9. */
    10. @WebServlet("/req4")
    11. public class RequestDemo4 extends HttpServlet {
    12. @Override
    13. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    14. //1. 解决乱码:POST,getReader()
    15. //request.setCharacterEncoding("UTF-8");//设置字符输入流的编码
    16. //2. 获取username
    17. String username = request.getParameter("username");
    18. System.out.println("解决乱码前:"+username);
    19. //3. GET,获取参数的方式:getQueryString
    20. // 乱码原因:tomcat进行URL解码,默认的字符集ISO-8859-1
    21. /* //3.1 先对乱码数据进行编码:转为字节数组
    22. byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
    23. //3.2 字节数组解码
    24. username = new String(bytes, StandardCharsets.UTF_8);*/
    25. username = new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);
    26. System.out.println("解决乱码后:"+username);
    27. }
    28. @Override
    29. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    30. this.doGet(request, response);
    31. }
    32. }
    1. package com.itheima.web;
    2. import java.io.UnsupportedEncodingException;
    3. import java.net.URLDecoder;
    4. import java.net.URLEncoder;
    5. public class URLDemo {
    6. public static void main(String[] args) throws UnsupportedEncodingException {
    7. String username = "张三";
    8. // 1. URL编码
    9. String encode = URLEncoder.encode(username,"utf-8"); // 以utf-8的形式进行编码
    10. System.out.println(encode); // 输出编码后的内容 %E5%BC%A0%E4%B8%89
    11. //2. URL解码
    12. // String decode = URLDecoder.decode(encode,"utf-8"); // 让编码进行解码
    13. // tomcat是用的ISO-8859-1 进行编码解码的,不是utf-8
    14. String decode = URLDecoder.decode(encode,"ISO-8859-1");
    15. System.out.println(decode); // 解码后 å¼ ä¸‰
    16. // 3. 转换位字节数据
    17. // 使用getBytes方法,将字符串类型的数据转换为字节类型, 返回的是一个数组
    18. byte[] bytes = decode.getBytes("ISO-8859-1");
    19. // // 将字节数组中的元素都遍历出来
    20. // for (byte b : bytes) {
    21. // System.out.print(b + " "); // -27 -68 -96 -28 -72 -119
    22. // }
    23. // 4. 将字节数组转换为字符串
    24. String s = new String(bytes, "utf-8");
    25. //将字节数组转换为字符串
    26. // 使用String构造方法转换: String res = new String(bytes, "UTF-8")
    27. System.out.println(s); // 将数组中的元素内容以字符串的形式输出来 张三
    28. }
    29. }