由于JDK是国际版的,在编译的时候,如果我们没有用 -encoding
参数指定我们的JAVA源程序的编码格式,则javac.exe首先获得我们操作系统默认采用的编码格式,也即在编译java程序时,若我们不指定源程序文件的编码格式,JDK首先获得操作系统的file.encoding参数(它保存的就是操作系统默认的编码格式,如WIN2k,WIN7,它的值为GBK),然后JDK就把我们的java源程序从file.encoding编码格式转化为JAVA内部默认的UNICODE格式放入内存中。然后,javac把转换后的unicode格式的文件进行编译成.class类文件,此时.class文件是UNICODE编码的,它暂放在内存中,紧接着,JDK将此以UNICODE编码的编译后的class文件保存到我们的操作系统中形成我们见到的.class文件。对我们来说,我们最终获得的.class文件是内容以UNICODE编码格式保存的类文件,它内部包含我们源程序中的中文字符串,只不过此时它己经由file.encoding格式转化为UNICODE格式了。当我们不加设置就编译时,相当于使用了参数:javac
-encoding gbk XX.java,当然就会出现不兼容的情况。
解决办法是:应该使用-encoding参数指明编码方式:javac -encoding UTF-8 XX.java
获取系统默认编码:
System.out.println("Default Charset=" + Charset.defaultCharset()); System.out.println("file.encoding=" + System.getProperty("file.encoding")); System.out.println("Default Charset in Use=" + FileTools.getDefaultCharSet()); public static String getDefaultCharSet() { OutputStreamWriter writer = new OutputStreamWriter(new ByteArrayOutputStream()); String enc = writer.getEncoding(); try { writer.close(); } catch (IOException e) { e.printStackTrace(); } return enc; }
使用的时候最好是统一的格式,比如java文件保存格式也同样为 UTF-8 格式的
在命令行的中使用时先设置一个java变量
set JAVA_TOOL_OPTIONS=-Dfile.encoding=utf-8 -Duser.language=en -Duser.country=US
通过命令行对JAVA文件进行编译
javac -d ../ *.java
这样生成出来的.CLASS文件格式也同样为 UTF-8 编码的
同样在执行java或者jar包前,要设置一个临时的或者永久的变量
set JAVA_TOOL_OPTIONS=-Dfile.encoding=utf-8 -Duser.language=en -Duser.country=US
这样才可以保证你的程序在运行java时,使用的是UTF-8编码格式
npp++的菜单在View和Language中间有一项就是Encoding, 可以非常方便的调整编码, 比Kate, Gedit做的还要好
其实应该更改的是java的设置, 让它默认以UTF-8来处理, 比GBK更有优势. 试试给文件加个BOM, 看看Java能不能认出来它是UTF-8
文件 另存为 命令,弹出对话框,最底下一行,保存按钮前边,不是可以选择编码吗?
首选项 新建 编码 可以更改默认 改成和你java一样的就行了