eclipse中文件存储的编码格式设置与对编码解码的理解

来源:互联网 发布:东莞优化网站 编辑:程序博客网 时间:2024/05/22 17:25

1、windows->Preferences…打开”首选项”对话框,左侧导航树,导航到general->Workspace,右侧Text file encoding,选择Other,改变为 utf-8(必须小写),以后新建立工程其属性对话框中的Text file encoding即为UTF-8。

2、windows->Preferences…打开”首选项”对话框,左侧导航树,导航到general->Content Types,右侧Content Types树,点开Text,选择 Java Source File,在下面的Default encoding输入框中输入UTF-8,点Update,则设置Java文件编码为UTF-8。然后设置jsp、js、css等类型的Default encoding,设置方式同Java Source File。

3.windows->Preferences…打开”首选项”对话框,左侧导航树,导航到MyEclipse->Files and Editors->JSP,把Encoding改为UTF-8

上面只是设置了我们写代码时候这些代码以什么格式存储,比如我们一般设置为utf8格式,但是当代码运行在不同系统下面因为系统编码方案不同。所以还是有可能乱码的。
JVM中defaultCharset()是在初始化阶段被调用初始化defaultCharset, 且只会初始化一次, JVM首先会取file.encoding指定的字符集, 如果取不到则使用系统默认字符集(如: windows下为GBK), 如果取不到则将defaultCharset设置为UTF-8字符集, defaultCharset一旦被初始化后, defaultCharset在JVM之后的运行过程中就无法再进行更改, 比如在JVM启动后在程序中使用properties.setProperty(“file.encoding”,”UTF-8”);也不会改变defaultCharset的值。上面就说明了这个问题。 如果想指定defaultCharset的值, 则可以通过JVM启动参数(-Dfile.encoding=”UTF-8”)来显示的指定此JVM的字符集!!!这个参数是影响程序运行时对字符串编解码处理的。

java源文件编码为utf8;运行启动JVM时候加了JVM字符集参数;eclipse启动时候设置JVM参数
"-Dfile.encoding=UTF8" 设置JVM启动运行时默认编码方案。

cmd启动 java -Dfile.encoding=UTF8 Encode

System.out.println("中文");        System.out.println(Charset.defaultCharset().name());        System.out.println(new String("中文0".getBytes()));        System.out.println(new String("中文1".getBytes(), "utf8"));        System.out.println(new String("中文2".getBytes(), "GB2312"));        System.out.println(new String("中文3".getBytes(), "ISO8859_1"));        System.out.println(new String("中文4".getBytes("GB2312")));        System.out.println(new String("中文5".getBytes("GB2312"), "GB2312"));        System.out.println(new String("中文6".getBytes(), "GBK"));        System.out.println(new String("中文7".getBytes("GBK"), "GBK"));        System.out.println(new String("中文8".getBytes(), "GB18030"));        System.out.println(new String("中华1".getBytes("GB18030"), "GB18030"));        System.out.println(new String("中文".getBytes("GB2312"), "ISO8859_1"));        System.out.println(new String("中文".getBytes("ISO8859_1")));        System.out.println(new String("中文".getBytes("ISO8859_1"), "GB2312"));        System.out.println(new String("中文".getBytes("ISO8859_1"), "ISO8859_1"));        String gb = new String("国标2312".getBytes("gbk"), "gbk");        System.out.println(gb);        System.out.println(Charset.defaultCharset().name());        System.out.println(System.getProperty("file.encoding"));        Properties properties = System.getProperties();        properties.setProperty("file.encoding", "GBK");        System.out.println(System.getProperty("file.encoding"));        System.out.println(Charset.defaultCharset().name());

输出结果:

中文UTF-8中文0中文1涓���2中æ3����4中文5涓枃6中文7涓枃8中华1ÖÐÎÄ??????国标2312UTF-8UTF8GBKUTF-8

上面中getBytes方法将一个字符串编码为一个字节数组,如果不指定字符集那么会使用Charset.defaultCharset().name()的编码集对字符串进行编码;
new String(byte[] bytes ,Charset charset); 这里涉及到用charset字符集对一个字节数组数据解码为一串字符串。如果你没有指定charset参数那么解码字符集将用默认的,(Charset.defaultCharset().name()返回的字符集)

所以对于 中文2 中文3 的输出语句就是因为用系统默认的字符集编码(我系统是utf8),然后用指定的编码集解码,而不是用utf8解码,所以肯定会乱码的。
中文4 是用了指定的编码集编码构建一个字节数组,但是通过字节数组构建一个字符串时候解码字符集用了系统默认字符集(utf8),所以也是乱码。
中文6的原因是用一个不支持汉字的编码和解码是一定错的。不管你的编码和解码是不是一样。

所以要防止乱码发生,需要保证

eclipse字符集设置
eclipse三种编码设置方式影响的范围
java可供判断某字符串是什么编码的一行代码

0 0