首页 > 代码库 > 【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编码引发的血案