javac編譯出現的編碼錯誤: 編碼GBK的不可映射字符

---恢復內容開始---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操作系統

相關文章
相關標籤/搜索