Request请求参数中文乱码处理
请求参数如果存在中文数据 则会乱码
// 我们直接使用模板给出的doPost方法 String username = request.getParameter("username"); System.out.println(username);
则浏览器中如果用户输入的username是中文 则返回的是乱码(get和post方法都是乱码)
解决POST下的中文乱码问题(不适用于get方法) 问题原因:getReader()方法默认的编码改为UTF-8 添加request.setCharacterEncoding("UTF-8");
解决get方法中文乱码方式 原因:getQueryString 并没有走流的方式 网页中的中文以URL编码的方式发送给tomcat 然而tomcat的 iso-8859-1解码出来的即使乱码 URL编码:1.将字符串按照编码方式转化为二进制 2.每个字节转化为两个16进制的数并且前面加% 然而在在UTF-8下面 每个汉字对应三个字节 6个16进制数 6*8=48个二进制位 所以两个中文汉字对应6个字节 每一个字节两个数 一个乱码 即一字节一乱码
关于URL解码
如果正确解码是这样的
// URL编码 演示 String encode = URLEncoder.encode(username,"utf-8"); System.out.println(encode); // URL解码 String decode = URLDecoder.decode(encode, "utf-8"); System.out.println(decode);
然而事实是这样的
// URL编码 演示 String encode = URLEncoder.encode(username,"utf-8"); System.out.println(encode); // URL解码 String decode = URLDecoder.decode(encode, "ISO-8859-1"); System.out.println(decode);
解决方法
乱码的底层二进制数解码为UTF-8形式即可 // 将乱码转换为字节数据 byte[] bytes = decode2.getBytes("ISO-8859-1"); String s = new String(bytes, "UTF-8"); System.out.println(s);