javac中不引人注目的编码小坑

来看下面这段java程序:

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

是不是感觉没什么问题,是的,的确没问题。

但在windows下使用javac Test.java编译该源文件(源文件编码为utf-8)时会报错,如下:

Test.java:3: 错误: 编码 GBK 的不可映射字符 (0x88)
        System.out.println("鍝堝搱鍝?");
                                ^
1 个错误

造成这个问题的原因如下:

源代码文件的字符编码格式为utf-8,但javac编译时会以操作系统默认的字符编码去解释源文件(中文windows平台默认字符编码为gbk),当源代码中只含有英文时不会出现什么问题,但当源文件中含有中文时就会出现上面的错误。

有两个解决这个问题的方法:

  • 源文件以gbk编码存储,此方法可行但不推荐。
  • 在javac的编译参数中有一个-encoding参数,该参数指定了源文件使用的字符编码,所以在编译时加上这个参数指定源文件的字符编码即可,如javac -encoding utf-8 Test.java

如果嫌弃每次都要写这么长的话,这里提供一个小方法:

  • 在源文件存储的目录中新建一个文本文件,写入以下内容javac -encoding utf-8 %1,重命名该文件为myjavac.bat(myjavac可替换为你喜欢的任何名字)。
  • 之后需要编译时使用如myjavac Test.java这样的命令即可。
  • 可以将该bat文件所在的目录加入到PATH环境变量中,这样在任何目录中都可以使用了。

如果想更懒可以写入javac -encoding utf-8 %1.java,这样你就可以不用写java后缀了,如myjavac Test

上面的方法适用于想简化任何命令的地方。

posted @ 2020-09-17 11:52  xyz-s  阅读(191)  评论(0编辑  收藏  举报