编程语言
首页 > 编程语言> > 如何解决在DOS编译java类时出现的“错误: 编码GBK的不可映射字符”

如何解决在DOS编译java类时出现的“错误: 编码GBK的不可映射字符”

作者:互联网

进来研究火龙果大大的控制台读取字符串,代码如下:




import java.io.Console;

 

public class ReadConsole {

public static void main(String[] args) {

String str = readConsole("请输入:");

System.err.println(str);

}

public static String readConsole(String prompt){

Console console = System.console();

if( console == null ){

throw new IllegalStateException("Can't read console!");

}

return console.readLine(prompt);

}

}


此代码必需在DOS下编译,即通过javac ReadConsole.java方式编译。

但是,编译时出现:错误: 编码GBK的不可映射字符


原来,需要添加参数:javac -encoding UTF-8 ReadConsole.java就可以解决。原理如下:


由于JDK是国际版的,在编译的时候,如果我们没有用-encoding参数指定我们的JAVA源程序的编码格式,则javac.exe首先获得我们操作系统默认采用的编码格式,也即在编译java程序时,若我们不指定源程序文件的编码格式,JDK首先获得操作系统的file.encoding参数(它保存的就是操作系统默认的编码格式,如WIN2k,它的值为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,当然就会出现不兼容的情况。

欢迎工作一到五年的Java工程师朋友们加入Java技术交流群:659270626
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!


标签:编码,java,类时,encoding,GBK,编译,格式,class
来源: https://blog.51cto.com/14028890/2421965