首页 > 代码库 > 【Java+Eclipse 编码设置】MD5编码引发的血案
【Java+Eclipse 编码设置】MD5编码引发的血案
先讲下事情的起因:
做了一个Java web project; 其中有一个java文件,里有个函数:
/** * @param s * @return 获取数据的MD5 */ public static String MD5(String s ) { char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; try { byte[] btInput = s.getBytes(); // 获得MD5摘要算法的 MessageDigest 对象 MessageDigest mdInst = MessageDigest.getInstance("MD5"); // 使用指定的字节更新摘要 mdInst.update(btInput); // 获得密文 byte[] md = mdInst.digest(); // 把密文转换成十六进制的字符串形式 int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte byte0 = md[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } return new String(str); } catch (Exception e) { e.printStackTrace(); return null; } }作用自然是获取字符串的MD5码。
可是我就纳闷了。
只要输入的字符串有中文,比如 “中国”
在java里单元自测时,输出为: C13DCEABCB143ACD6C9298265D618A9F
而作为tomcat web网站运行时,输出却是: CF0832DEDF7457BBCBFA00BBD87B300A
经调查研究,发现,问题出在这句话上:
byte[] btInput = s.getBytes();getBytes 这个函数是JDK提供的,
如果不指定输入字符串的编码,JRE会自动从 Dfile.encoding 读取。
而JRE 的Dfile.encoding 默认为GBK。
然而,我的Myeclipse项目全被我设置为了UTF-8,输入的字符串自然也是UTF-8格式。
而Myeclipse里使用的JRE 可不是我们系统安装的JRE,而是自己自带的,这个JRE你在CMD下打java -version 是看不出来的。
这个自带的jre 会在运行时自动加载项目自身的编码,然后以该编码运行,所以在JAVA文件里自测时,run as application出来的是对的。
而我运行网站用的是自己配置的tomcat,其作为java程序运行时,没有指定dfile.encoding,默认为 gbk,所以才会出现上述错误。
解决方案:
(1) 改变tomcat作为java程序运行时的参数。这个只需要设置jre 的启动参数即可。
(2)养成好的习惯,在代码中指定编码。 (推荐。) 如: getBytes("UTF-8")
注意: 一个JRE实例,windows下进程名叫做java.exe 只能有一个Dfile.encoding,一个tomcat会跑在一个java程序中。所以一个tomcat下的多个网站,也只能共用一个dfile.encoding,换句话说,这个encoding 是java VM的不是tomcat的。
MyEclipse配置
1、JDK 编码:window-->preferences-->java-->Installed JREs-->Edit JRE-->Default VM Arguments -Dfile.encoding=UTF-8
2、文件编码:window-->preferences-->General-->Content Types-->Text UTF-8
3、工作区workspace编码:window-->preferences-->General-->workspace
4、对工程project进行编码设置 工程名 右键 properties Resource
5、tomca设置:window -->preferences -->MyEclipse -->Servers -->Tomcat -->Tomcat 5.X-->JDK-->Optional Java VM Arguments -Dfile.encoding=UTF-8
【Java+Eclipse 编码设置】MD5编码引发的血案