GBK编码文件为什么能在UTF-8平台上正常显示?

CharSetTest.java文件内容如下,在Windows下编译为class文件。

import java.nio.charset.Charset;
import java.io.OutputStreamWriter;
import java.io.ByteArrayOutputStream;
public class CharSetTest {

    public static void main(String[] args) {
        System.out.println("Default Charset=" + Charset.defaultCharset());
        System.setProperty("file.encoding", "Latin-1");
        System.out.println("file.encoding=" + System.getProperty("file.encoding"));
        System.out.println("Default Charset=" + Charset.defaultCharset());
        System.out.println("Default Charset in Use=" + getDefaultCharSet());
        System.out.println("Default 字符集(在使用中的)=" + getDefaultCharSet());
    }

    private static String getDefaultCharSet() {
        OutputStreamWriter writer = new OutputStreamWriter(new ByteArrayOutputStream());
        String enc = writer.getEncoding();
        return enc;
    }
}
首先在本地Windows上运行:
 
D:\Apps\Java\jdk1.6.0_35\jre\bin\java.exe CharSetTest
Default Charset=GBK
file.encoding=Latin-1
Default Charset=GBK
Default Charset in Use=GBK
Default 字符集(在使用中的)=GBK
 
D:\Apps\Java\jdk1.6.0_35\jre\bin\java.exe -Dfile.encoding=GBK CharSetTest
Default Charset=GBK
file.encoding=Latin-1
Default Charset=GBK
Default Charset in Use=GBK
Default 字符集(在使用中的)=GBK
 
D:\Apps\Java\jdk1.6.0_35\jre\bin\java.exe -Dfile.encoding=UTF-8 CharSetTest
Default Charset=UTF-8
file.encoding=Latin-1
Default Charset=UTF-8
Default Charset in Use=UTF8
Default 瀛楃闆嗭紙鍦ㄤ娇鐢ㄤ腑鐨勶級=UTF8

 

这个结果符合预期,因为文件本身是GBK编码的,使用UTF-8运行会出现乱码,但这个class文件ftp到Linux下运行的结果就比较奇怪了:

/opt/jdk1.6.0_35/bin/java CharSetTest
Default Charset=UTF-8
file.encoding=Latin-1
Default Charset=UTF-8
Default Charset in Use=UTF8
Default 字符集(在使用中的)=UTF8
 
/opt/jdk1.6.0_35/bin/java -Dfile.encoding=GBK CharSetTest
Default Charset=GBK
file.encoding=Latin-1
Default Charset=GBK
Default Charset in Use=GBK
Default ؖ·՚ʹԃאµģ©=GBK
 
/opt/jdk1.6.0_35/bin/java -Dfile.encoding=UTF-8 CharSetTest
Default Charset=UTF-8
file.encoding=Latin-1
Default Charset=UTF-8
Default Charset in Use=UTF8
Default 字符集(在使用中的)=UTF8
 
为什么指定为GBK会出现乱码,使用UTF-8反而不会?
凤凰求蛊
浏览 786回答 7
7回答

侃侃尔雅

前面出现那种情况是因为你的文件的编码方式是GBK,所以改为utf-8就会出错。第二种情况有可能是你linux系统下的默认格式是utf-8,当你把GBK编码的文件导入时,GBK格式自动转换为了utf-8。eclipse挺智能的,今天就有那感觉。我的myeslipse的编码是utf-8的,由于我的eclipse的编码是GBK,当我把项目导入到eslipse中时,项目的文件就自动变成GBK了.不知道那是不是特殊情况,你可以做做实验验证下那,看是不是那样

蓝山帝景

utf-8 是国际编码规范,我感觉utf-8是为类似中文文字的所有文字的编码,(例如还包括韩文,日文,以及繁体中文) 而GBK只是文中的编码,所以如果是英文的操作系统,或是其他语言的操作系统,如果用utf-8的话,应该是都能正常显示的, 如果用GBK可能就不一定能正常显示了,

元芳怎么了

还是utf-8比较强大,通用性强。做网页一般都用那个编码。

慕雪6442864

默认编码跟操作系统有关, window默认就是GBK, JVM默认就取系统编码,so, 只要保证编译时期和运行时期文件、字符编码都一致,就不会出现乱码问题。

MYYA

mark

呼啦一阵风

因为utf-8比GBK高,显示的中文多。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java