关于tomcat版本不同导致的get请求携带中文参数乱码的问题产生的过程

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相等,事实证明是相等的
最后输出正常中文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值