---恢复内容开始---html
在Windows平台下,当Java源代码中包含中文字符时,若是咱们利用代码编辑器保存代码时是utf-8编码格式保存,那么咱们在用javac编译时会出现“错误:编码GBK的不可映射字符”。java
咱们在用javac编译时,编译程序首先会得到咱们windows操做系统默认采用的编码格式(GBK),这样在从硬盘读取java文件的时候(此时在硬盘中的表现形式是以前存储java文件时utf-8编码成的字节流文件)就至关于按GBK格式解码,而原编码为utf-8,就会发生解码错误,致使没法编译。当咱们不加设置就编译时,至关于使用了参数:javac -encoding GBK Strean.java,就会出现不兼容的状况。解决以上问题有以下两种方式:windows
1.用-encoding参数指明编码方式:javac -encoding UTF-8 Stream.java,这样就至关于利用utf-8格式对硬盘读取出的java文件进行解码,不会出现解码错误问题。数组
2.利用代码编辑器对java文件进行转换编码格式存储,换成GBK编码存储方式存储便可。jvm
当采用上述2方式解决时,java编译器将Java源文件从GBK编码格式转换为Java内部默认的Unicode格式放入内存中,而后javac把转换后的Unicode格式的文件编译成class文件存储,class文件是Unicode编码的。当咱们运行 java Stream 命令时,java解释器将此文件以Unicode格式编码的class文件保存到jvm内存中造成运行文件。具体的java编译器采用utf8,在java编译阶段是utf8,此时还未涉及到java解释器,即class文件的存储是用utf8,由于相对于utf16,utf8在处理英文占用内存小,而程序大部分都是英文。jvm运行时的编码方式是utf16,即jvm用utf8从class文件读取程序后再转化为utf16编码的字符串,由于utf16是2个字节,统一的长度更方便jvm申请数组等操做。编辑器
须要注意的是,通常涉及到IO操做时,咱们只要保证编码和解码字符集一致就能够防止乱码。有些应用程序若是不注意指定字符编码,中文环境中取操做系统默认编码,若是编解码都在中文环境中,一般也没问题,可是仍是强烈的不建议使用操做系统的默认编码,由于这样,你的应用程序的编码格式就和运行环境绑定起来了,在跨环境下极可能出现乱码问题。ui
参考:1.https://www.cnblogs.com/maohuidong/p/8044568.html编码
2.https://zhidao.baidu.com/question/494528739317154332.htmlspa
3.https://blog.csdn.net/qitehuanjue/article/details/52682820操作系统