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
。
上面的方法适用于想简化任何命令的地方。