问题描述:
数据经过AES加密后,调用服务接口,服务方在收到数据解密后发现中文字符串有乱码情况。
例如中文姓名张三,服务接受到的是???
1、定位问题分析
首先检查加解密过程代码,发现加密数据是对原始字符串做了String.getBytes(), 里面并没有指定具体的字符编码。
与服务方确认那边都是统一使用的UTF-8编码,由于测试环境linux环境默认使用的是UTF-8编码,所以在String.getBytes()没有指定字符串编码的情况下,默认是采用你linux系统的编码。因此测试环境没有重现出问题。
然后检查生产环境linux服务编码发现是en_uc与测试环境编码不一致,基本可以定位乱码问题是因为String.getBytes()没有指定字符串编码导致的。
2、问题复现
查看linux系统使用的编码命令:locale 或者 echo $LANG
修改测试环境linux环境系统编码操作:
cd /etc 进入目录;
vi profile 文件,在最后一行插入 export LANG=en_uc (自己要设置的编码), 退出并保存;
通过命令 source profile 让本次修改生效;
然后使用命令locale 查看,此时编码已经是本次所修改的了;
再次发送交易给服务方,果然对方接受到的中文是乱码
3、问题解决方案
修改代码里String.getBytes() 为 String.getBytes("UTF-8");
4、总结
问题完美解决,切记在使用getBytes()按照规范一定要指定具体的编码集,这样你的代码就不会因为环境不同导致乱码问题的出现。