java学习: java编译报 编码 GBK 的不可映射字符 (0x80)与ANSI系统编码

以下是java源码:

public class test{
    public static void main(String[] args){
    System.out.println("test");

    byte a=1;    //这里结束需要分号; 以下类推
    System.out.println(a);

    short b = 6;
    System.out.println(b);

    int c = 2;
    System.out.println(c);

    long d = 3l;          //赋值后面需要l
    System.out.println(d);

    double e = 1.23;
    System.out.println(e);

    float f = 1.245f;      //赋值后面需要f
    System.out.println(f);

    char g = 'n';
    System.out.println(g);

    boolean h = false;
    System.out.print(h);
    }

}

编译的时候出错,如下:

 

 我百度了一下找到的解决方案是:

方法1:利用javac -encoding UTF-8命令进行编译,编译时执行的命令为:javac -encoding UTF-8 test.java。执行后,java源程序就被成功编译为.class文件,并且能够通过java.exe命令执行。

方法2:将test.java另存为,变设置编码格式为ANSI,如下图:

 然后,再来分析原因,涉及以下几个概念:

1、java 默认是利用Unicode字符集,具体编码方式用的就是UTF-8;

2、新建.txt的文件修改后缀为.java,默认编码方式为UTF-8;

3、操作系统默认用的是GBK编码方式;

从以上3点可以看出问题,操作系统默认编码是GBK,而java是UTF-8,这里属于编码冲突。把编码方式改成一致即可。再回到以上2种解决方法:

方法一:通过命令强制系统按照UTF-8进行编码完成.java到.class的编译过程。

方法二:将文件修改成ANSI编码,让JAVA按照ANSI编码(ANSI也就是GBK)。

以上是我自己的体会,如果理解不对欢迎指正。

———————————————————————————————————————————————————————————————————————

 补充知识点:

1、unicode是国际通用编码。Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。所以实际上这个Unicode只是一个字符的协议文档,具体的实现是由各自实现的,所以衍生出UTF-8,UTF-16,UTF-32。

2、不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、Big5、Shift_JIS 等各自的编码标准。这些使用 1 至 4 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码;在日文Windows操作系统中,ANSI 编码代表 Shift_JIS 编码。 不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。 当然对于ANSI编码而言,0x00~0x7F之间的字符,依旧是1个字节代表1个字符。这一点是ANSI编码与Unicode编码之间最大也最明显的区别。

3、utf8是对unicode字符集进行编码的一种编码方式。

posted @ 2020-03-07 16:59  wzwzzzzz  阅读(1047)  评论(0)    收藏  举报