日期:2014-05-17  浏览次数:20842 次

Windows Eclipse下潜在的文件编码问题
如果你和我一样,在Windows下用Eclipse开发Java程序,尤其是Web程序,为了防止乱码问题,都习惯于将默认的文件编码设置为“UTF-8”。
BTW,设置默认文件编码的方法:

Java代码文件和其他文本文件:Windows->Preferences->General->Wordspace->Text file encoding


css,jsp,html文件:Windows->Preferences->Web->CSS Files/HTML Files/JSP Files


经过以上的设置之后,在Eclipse下新建文件都默认采用UTF-8编码,但是问题出现了,用下面这段java代码测试一下Windows系统的默认文件编码和在Eclipse中默认的文件编码分别是什么。
package com.lveyo.java.lite.system;

import java.util.Properties;

public class SystemProperties {
	public static void main(String[] args) {
		Properties props = System.getProperties();
		System.out.println("Java Version: " + props.getProperty("java.version"));
		System.out.println("Java Vendor: " + props.getProperty("java.vendor"));
		System.out.println("JVM Version: " + props.getProperty("java.vm.version"));
		System.out.println("Java Specification Version: " + props.getProperty("java.specification.version"));
		System.out.println("OS name: " + props.getProperty("os.name"));
		System.out.println("OS architecture: " + props.getProperty("os.arch"));
		System.out.println("OS Version: " + props.getProperty("os.version"));
		System.out.println("File Encoding: " + props.getProperty("file.encoding"));
		System.out.println("User Language: " + props.getProperty("user.language"));
	}
}


在Eclipse下直接运行这段程序,结果为:
Java Version: 1.6.0_24
Java Vendor: Sun Microsystems Inc.
JVM Version: 19.1-b02
Java Specification Version: 1.6
OS name: Windows 7
OS architecture: x86
OS Version: 6.1
File Encoding: UTF-8
User Language: zh


直接将此段程序在Windows命令行下执行,结果为:
D:\LiteJava\bin>java com.lveyo.java.lite.system.SystemProperties
Java Version: 1.6.0_21
Java Vendor: Sun Microsystems Inc.
JVM Version: 17.0-b16
Java Specification Version: 1.6
OS name: Windows 7
OS architecture: x86
OS Version: 6.1
File Encoding: GBK
User Language: zh


我几乎测试了所有中文版的Windows操作系统,默认编码都是GBK。

问题的产生:
运行的结果发现,程序在命令行下运行文件编码变为GBK,也就是说如果开发的程序部署到Windows主机的服务器下,那么默认的文件编码是GBK的,虽然页面JSP文件也是用UTF-8显示,系统自身不会产生乱码问题,但是若开发与其它系统对接的程序,如网上支付等,需要传中文到其他系统的时候就会出现开发环境和生成环境文件编码不同产生的乱码问题。

解决方案:

  1. 将开发和生产环境都迁移到Linux下,全部采用UTF-8编码。各个系统之间也统一采用UTF-8编码,各种语言各种文字都不会产生乱码,这也是比较彻底的解决方案。
  2. 在Windows下运行,可以在命令行加参数“-Dfile.encoding=UTF-8”,来修改默认的文件编码。

1 楼 魂魄魔君 2011-10-21