在计算字符串的Hash摘要时,一定要注意字符串的编码,使用Charset.defaultCharset()
查看JVM的默认字符编码。
不同字符串编码算出来的Hash值是不一样的。
可以使用StringBuilder构建字符串,然后转码为固定的String
StringBuilder mingxiSb = new StringBuilder();
String mingxi = new String(mingxiSb.toString().getBytes(), "utf-8");
org.apache.commons.codec.digest.DigestUtils.sha256Hex(mingxi.getBytes("utf-8")).toUpperCase();
使用以下代码进行编码转换时可能导致乱码,具体原因搜索GBK转UTF-8乱码
String mingxi = new String(mingxiSb.toString().getBytes(), "utf-8");
所以结论是不要尝试进行GBK与UTF-8的编码转换,在程序编写初期就应该统一编码格式。
我写这篇博文的情况是两个不同系统进行对接,一个是Windows,一个是Linux。
最根本的解决方式,是在系统的环境变量中配置变量名为JAVA_TOOL_OPTIONS,变量值为-Dfile.encoding=UTF-8。
或者在Tomcat中配置Java启动参数为-Dfile.encoding=UTF-8。