记录一次httpClient调用接口在不同的环境下中文变“?”乱
最近在写一个短信服务,很简单就是调用移动的能力开发平台的接口实现发送短信和状态查询;
本人开发用的是mac下 IDEA,在本地测试跑起来没有问题,但是把class文件拷贝到window环境的tomcat下结果出现了对移动请求的参数中文变?的乱码(其实是一部分)情况;代码如下:
然后就开始了网上找答案的过程;
我当时第一反应是代码肯定没错,因为我本地跑起来并没有问题;然后就开始找环境的问题,那肯定是tomcat问题,顺着这个思路,开始查tomcat中文乱码问题,修改了server.xml的配置;参考链接:tomcat中文链接问题;发现怎么改都不起作用,失败了;
(原因是我这的乱码其实并不涉及前后台的数据传递)
接着想办法,我mac这边是打包成class文件,然后放入的tomcat环境,那是不是不同的JRE对class文件解析不一致造成的?试一试。找到了文章:Java HttpClient Post请求发送数据乱码;
当时我一看这文章就觉得找到了解决方案,修改了 $TOMCAT_HOME/bin/catalina.bat 文件,果然成功了;
(思路还是错了,class文件是unicode编码的,servlet传给移动的接口的数据也是unicode编码的,然后由httpclient处理对数据按照utf8编码,只要我传出去数据正确,移动那边服务器设置utf8编码接收,应该是没问题);
这时出现了一个新的问题cmd窗体下的的tomcat下console出现了乱码问题,原因是因为window默认的编码是GBK而我的日志输出是utf8的,华丽丽的乱码了,还好log日志不乱码(编辑器会解析),先上线将就用吧;参考文章:tomcat乱码问题;
(问题到这其实是最大的,个人认为解决了,通过cmd 注册表的编码修改也可以实现console不乱码,没有深究下去)
项目上线,安装到了客户那里,客户一看这cmd怎么乱七八糟,不行,一定要求解决;
没办法,再想办法解决,静下心来去仔细梳理思路,一步步debug打日志去看啥时候出现了乱码,是否是数据库中取出来是乱码,然后终于发现了问题,我在对数据库取出的参数操作时,加了一句转码new String(xx,“utf-8”),我的mac IDEA设置的是utf-8环境jdk,该参数由utf8编码,utf8解码,运行后生成unicode数据,然后由httpClient工具类进行url编码,没啥问题;换到了GBK环境下,那参数转成了utf8编码,在GBK下就是乱码了,乱码以后再生成unicode编码再utf8编码都是乱码了;
最后除去这转码的代码,跨平台不同jdk也可以使用了;
小白一枚,理解上如有问题,还请大神指出;