一个汉字在utf8中占3个字节,1个字节8位二进制码,
底层的2进制的数据是一样的(也就是字节对应的二进制),乱码的内容, 所以转换成字节类型(用getBytes方法)
// 3. 转换位字节数据
// 使用getBytes方法,将字符串类型的数据转换为字节类型, 返回的是一个数组
//将字节数组转换为字符串
// 使用String构造方法转换: String res = new String(bytes, “UTF-8”)
package com.itheima.web;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
/**
* 中文乱码问题解决方案
*/
@WebServlet("/req4")
public class RequestDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 解决乱码:POST,getReader()
//request.setCharacterEncoding("UTF-8");//设置字符输入流的编码
//2. 获取username
String username = request.getParameter("username");
System.out.println("解决乱码前:"+username);
//3. GET,获取参数的方式:getQueryString
// 乱码原因:tomcat进行URL解码,默认的字符集ISO-8859-1
/* //3.1 先对乱码数据进行编码:转为字节数组
byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
//3.2 字节数组解码
username = new String(bytes, StandardCharsets.UTF_8);*/
username = new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);
System.out.println("解决乱码后:"+username);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
package com.itheima.web;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
public class URLDemo {
public static void main(String[] args) throws UnsupportedEncodingException {
String username = "张三";
// 1. URL编码
String encode = URLEncoder.encode(username,"utf-8"); // 以utf-8的形式进行编码
System.out.println(encode); // 输出编码后的内容 %E5%BC%A0%E4%B8%89
//2. URL解码
// String decode = URLDecoder.decode(encode,"utf-8"); // 让编码进行解码
// tomcat是用的ISO-8859-1 进行编码解码的,不是utf-8
String decode = URLDecoder.decode(encode,"ISO-8859-1");
System.out.println(decode); // 解码后 å¼ ä¸
// 3. 转换位字节数据
// 使用getBytes方法,将字符串类型的数据转换为字节类型, 返回的是一个数组
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");
//将字节数组转换为字符串
// 使用String构造方法转换: String res = new String(bytes, "UTF-8")
System.out.println(s); // 将数组中的元素内容以字符串的形式输出来 张三
}
}