2014年11月4日 星期二



為了讓基礎紮實一點,而是直接用Notepad++這套文字編輯軟體
在編譯某個小練習時噴了這個錯誤出來: unmappable character for encoding MS950
Image1 Google這個錯誤訊息後,找到了這篇文章 原來是因為Notepad++預設是採UTF8編碼,而在JAVA編譯程式時,則是採用作業系統預設的編碼(也就是MS950)
(註: 在Windows環境下,預設的編碼是MS950,也就是我們常看到的ANSI編碼)
所以當要被編譯的檔案是使用UTF8編碼,在有中文字的地方就會出錯
補充:詳細原因可以閱讀良葛格整理的這篇文章: 你的原始碼是什麼編碼?
如果你用記事本轉存為「Unicode」或「Unicode big endian」編碼,那你要如何編譯?答案是指定-encoding告知編譯器原始檔案的編碼:

C:\workspace>javac -encoding UTF-16 Main.java

如果你用記事本轉存為「UTF-8」編碼,那你要如何編譯?答案是無法編譯,即使你指定了-encoding為UTF-8也一樣...

C:\workspace>javac -encoding UTF-8 Main.java
Main.java:1: illegal character: \65279
?public class Main {
^
1 error

在 
UTF-8 中談過,因為Windows的記事本存成UTF-8時,會在檔首加上BOM,javac編譯器並不處理BOM,只會視為不合法字元,如果你要將原始碼存為UTF-8,必須使用可存為檔首無BOM的編譯器,例如 NotePad++
所以,針對這個問題的解決辦法有二:
1. 在編譯時指定採用的編碼為UTF8,EX: javac -encoding utf-8 example.java
執行結果:
Image2 
2. 在Notepad++上先將檔案存為ANSI編碼的格式,更改方式如下↓

在Win7下編譯原始檔時,出現下列的錯誤:warning: unmappable character for encoding MS950

因為我是用Notepad++編輯,並且將字元集設定為utf-8,所以遇到中文字時就會產生無法匹配的情形。
因此在編譯時需要使用參數encoding來進行轉換,如下:
javac -encoding utf-8 001.java

另外我把Notepad++ 的字元集設定為ANSI,則編譯時就不會出現錯誤了
執行結果:
Image3  
那麼,為什麼最早開始學JAVA時沒遇過這問題呢? 我想原因是因為Windows的記事本
他的存檔類型預設就是以ANSI做編碼(如下圖所示),所以就天真的編譯成功。。。(?) 哈哈
Image4  


參考連結References:

沒有留言:

張貼留言