URL编码网址链接:https://tool.ip138.com/urlencode/
String arg = "中文"; //模拟浏览器get请求输入中文参数byte[] bytes1 = arg.getBytes(StandardCharsets.UTF_8);String res1 = URLEncoder.encode(arg, "UTF-8"); //浏览器地址栏URL编码String decode = URLDecoder.decode(res1, "ISO-8859-1"); //tomcat8以后默认都是utf-8,但是这里模拟的是tomcat8之前的版本,默认iso-8859-1解码byte[] bytes = decode.getBytes(StandardCharsets.ISO_8859_1);String res2 = new String(bytes, "UTF-8");String res3 = new String(bytes1,"iso-8859-1");System.out.println(res2);
解析:
第一行我首先创建了一个名为“中文”的字符串,
第二行我使用getBytes方法根据指定的UTF-8编码返回该字符串在该编码下的byte数组,
第三行我使用URLEncoder.encode方法将"中文"以UTF-8编码转为URL编码后的res1(这里模拟浏览器发送get请求携带中文参数的情况,一般HTML文件都是指定UTF-8编码),
第四行我将编码后的结果模拟发送到tomcat,假设tomcat版本为7,那么默认会使用iso-8859-1编码方式去解码,于是就有了String decode = URLDecoder.decode(res1, "ISO-8859-1");
以下是URLDecoder.decode方法的注释
Decodes a application/x-www-form-urlencoded string using a specific encoding scheme. The supplied encoding is used to determine what characters are represented by any consecutive sequences of the form “%xy”.
使用特定的编码方案对application/x-www-form-urlencoded字符串进行解码。所提供的编码被用来确定任何连续的"%xy “形式的序列所代表的是什么字符。
也就是说这个方法走了两步,第一步是确定任何连续的”%xy "形式的序列所代表的是什么字符,第二步是将确定后的字符按iso-8859-1编码方式去编码
第五行是将上一步编码后的字符串decode
按iso-8859-1字符集编码为字节数组,这样就拿到了传入的字节数组bytes
第六行是将bytes
按UTF-8字符集解析成字符串
第七行就是将第二行中的bytes1
字节数组按iso-8859-1字符集解析为字符串,这一步是用来确定是否和tomcat解析的decode
相等,事实证明是相等的
最后输出正常中文