為了讓基礎紮實一點,而是直接用Notepad++這套文字編輯軟體
在編譯某個小練習時噴了這個錯誤出來: unmappable character for encoding MS950
(註: 在Windows環境下,預設的編碼是MS950,也就是我們常看到的ANSI編碼)
所以當要被編譯的檔案是使用UTF8編碼,在有中文字的地方就會出錯
所以當要被編譯的檔案是使用UTF8編碼,在有中文字的地方就會出錯
補充:詳細原因可以閱讀良葛格整理的這篇文章: 你的原始碼是什麼編碼?
如果你用記事本轉存為「Unicode」或「Unicode big endian」編碼,那你要如何編譯?答案是指定-encoding告知編譯器原始檔案的編碼:
如果你用記事本轉存為「UTF-8」編碼,那你要如何編譯?答案是無法編譯,即使你指定了-encoding為UTF-8也一樣...
在 UTF-8 中談過,因為Windows的記事本存成UTF-8時,會在檔首加上BOM,javac編譯器並不處理BOM,只會視為不合法字元,如果你要將原始碼存為UTF-8,必須使用可存為檔首無BOM的編譯器,例如 NotePad++。

如果你用記事本轉存為「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
執行結果:
1. 在編譯時指定採用的編碼為UTF8,EX: javac -encoding utf-8 example.java
執行結果:

2. 在Notepad++上先將檔案存為ANSI編碼的格式,更改方式如下↓
在Win7下編譯原始檔時,出現下列的錯誤:warning: unmappable character for encoding MS950
因為我是用Notepad++編輯,並且將字元集設定為utf-8,所以遇到中文字時就會產生無法匹配的情形。
因此在編譯時需要使用參數encoding來進行轉換,如下:
javac -encoding utf-8 001.java
另外我把Notepad++ 的字元集設定為ANSI,則編譯時就不會出現錯誤了
因此在編譯時需要使用參數encoding來進行轉換,如下:
javac -encoding utf-8 001.java
另外我把Notepad++ 的字元集設定為ANSI,則編譯時就不會出現錯誤了
執行結果:

那麼,為什麼最早開始學JAVA時沒遇過這問題呢? 我想原因是因為Windows的記事本
他的存檔類型預設就是以ANSI做編碼(如下圖所示),所以就天真的編譯成功。。。(?) 哈哈
他的存檔類型預設就是以ANSI做編碼(如下圖所示),所以就天真的編譯成功。。。(?) 哈哈

沒有留言:
張貼留言