首页 新闻 会员 周边

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

0
悬赏园豆:20 [已解决问题] 解决于 2014-03-12 15:28

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反而不会?
leechau的主页 leechau | 初学一级 | 园豆:172
提问于:2012-12-14 15:19
< >
分享
最佳答案
0

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

收获园豆:10
cel | 菜鸟二级 |园豆:380 | 2013-05-09 23:08
其他回答(6)
0

utf-8 是国际编码规范,我感觉utf-8是为类似中文文字的所有文字的编码,(例如还包括韩文,日文,以及繁体中文)

而GBK只是文中的编码,所以如果是英文的操作系统,或是其他语言的操作系统,如果用utf-8的话,应该是都能正常显示的,

如果用GBK可能就不一定能正常显示了,

收获园豆:10
只会造轮子 | 园豆:2274 (老鸟四级) | 2012-12-14 16:22
0

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

angelshelter | 园豆:9887 (大侠五级) | 2012-12-14 17:46
0

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

爱吃皮皮虾 | 园豆:54 (初学一级) | 2012-12-26 11:27
0

mark

yajiao | 园豆:218 (菜鸟二级) | 2013-01-22 23:15
0

因为utf-8比GBK高,显示的中文多。

若雪封尘 | 园豆:463 (菜鸟二级) | 2013-02-28 10:12
0

因为gbk与utf8都向下兼容ASCII,如果文件内容仅包含常见的拉丁字母与符号,那么你当它是gbk还是utf8编码都不会错。

ligand | 园豆:202 (菜鸟二级) | 2014-01-12 08:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册