处理方案
工作中遇到了请求对象中的属性出现中文乱码的问题,最初想到的处理方案就是尝试将乱码字符串进行解码,尝试过了很多解码方式,然而结果并不理想,做好的结果解释解决了一部分乱码的问题。。。。
String str1="娴嬭瘯";
System.out.println(new String(str1.getBytes("gbk")));
String str2="鐧诲綍鍚�";
System.out.println(new String(str2.getBytes("gbk")));
结果如下:
正常情况下我们所期望的结果时,(测试、登录名)
- 可以很明显的看出,但字符数为偶数个的时候还好,但是当字符为奇数的时候就会有问题。而且一般像那种乱码中带了
?
类似的奇怪符号的根本无法再解出来。 - 想到了奇数和偶数字符编码的问题,有些处理乱码经验的程序员可以想到gbk和ut8的编码转换问题。
1.简单的推理
我们来复现一下,代码如下:
String str2="登录名";
System.out.println(new String(str2.getBytes("utf-8"),"gbk"));
结果如下:
看,这不就是我们之前用gbk解码之前的乱码字符串吗,很容易得出结论,和我们后台交互的服务的编码时utf-8,但是我们默认使用的解码规则时gbk。。。。。
至于为什么gbk和utf-8都有中文编码,但是互转会乱码以及奇数和偶数乱码的问题,我就不再赘述了,可以参考如下文章
gbk和utf-8转换乱码问题解析
2.解决,
既然已经找到问题的所在了,现在要着手解决问题了,后端项目用的springboot,设置了编码的utf-8,所以tomcat的编码应该也没有问题,业务代码中也没有编码的修改,那么就可能时过滤器或者这边的拦截器有问题,突然想起来之前项目对接了一个认证平台,加入了第三方提供的一个过滤器,可能他们提供的过滤器编码有问题,查看过滤器的配置,发现没有编码的配置。em~,可能他们提供的过滤器有默认编码。。。
好家伙,对着新加入的过滤器一阵翻找,还真发现了他编码相关的参数,好吧,他什么都没有
这个时候就想办法给他设置一下编码,再过滤器中设置对应的编码
Map<String, String> initParameters = new HashMap<String, String>();
initParameters.put("encoding", "utf-8");
filter.setInitParameters(initParameters);
设置编码之后,之前中文乱码的问题处理好了。
3.提示
这只是适合我遇到问题的处理场景,编码的问题说简单也简单,说难也难,当生产环境出现了乱码的问题,没法复现和调试就更加恼火,这时候可以请求你的技术组长或者相关大佬,你踩过的坑说不定他们已经遇到过,这样能快速处理问题,避免继续卡住影响后续的工作;当然,时间足够的情况下可以深入研究,毕竟总有天赋异禀的人能第一个吃螃蟹。