字符串由于编码问题导致生成的Md5不同

今天工作上遇到一个问题,json格式字符串用于生成md5的签名,用于服务端调用快递100网站的生成快递单的接口,但是老返回签名错误,原因是我生成的签名和快递100的签名一直不一样,但是用我的json字符串在他的方法上却跟他的一样(页面上的js的md5方法),从这里看出,不是我的字符串问题,是我的方法问题,于是乎我再Main方法中试我的md5方法,结果显示的是跟快递100是一样的,我的天,Main方法和项目启动调用接口生成的Md5还不一样,一样的方法,不同的是一个是main方法生成,一个是启动服务调用接口,接口里用这个方法生成的。

百思不得其解,一样的方法,再不同的方式调用的结果怎么会不一样呢,思考尝试了一下午,原来:

在md5方法中,字符串(有中文的)传进去是要得到字符串的Byte数组的,Byte[] b = s.getBytes();这个方法没有指定编码格式,而我的tomcat设置了编码是GBK,所以当在tomcat中执行getBytes()方法的时候是默认跟随环境的编码,所以当在tomcat环境中执行的时候getBytes()是GBK编码的,而在Main方法是根据eclipse文件的编码来执行的,而我们eclipse的编码一般都是设置成UTF-8的,所以在Main里编码是utf-8,而tomcat是GBK,导致生成的MD5不一样,

解决方法:s.getBytes("UTF-8"),通过system.getProperty("file.encoding")可以查看到当前java文件编译成class文件是什么编码的

好了,问题找到了,解决方法也找到了,问题解决了,但是呢,底层的原因呢,是class文件,服务是在tomcat中启动的,所以class文件也在tomcat里,class文件的编码也就是默认跟tomcat 一样了。

你可能感兴趣的:(工作遇到)