你的原始碼是什麼編碼? - OpenHome.cc
文章推薦指數: 80 %
很令人訝異的事情是,當被問及「你現在編輯的原始碼檔案是什麼編碼?」,不少程式設計人員都答不出來。
如果在正體中文Windows 中開一個純文字檔案,用「記事本」編輯 ...
回Encoding目錄
很令人訝異的事情是,當被問及「你現在編輯的原始碼檔案是什麼編碼?」,不少程式設計人員都答不出來。
如果在正體中文Windows中開一個純文字檔案,用「記事本」編輯的話,應該是用MS950來處理原始碼中字元的儲存,現在許多Linux系統,預設使用UTF-8編碼,所以在這些Linux直接使用vim等編輯器編輯原始碼的話,預設應該就是UTF-8。
如果是在整合開發環境(IDE)中,要視IDE的設定,有些IDE預設是使用作業系統編碼,有些IDE預設使用UTF-8,如果在IDE中,預設是用Big5的編輯器,結果開啟UTF-8的原始碼,也會是亂碼,你必須指定編輯器使用正確的編碼來開啟原始碼。
這有什麼問題呢?以Java而言,在正體中文Windows中,如果用舊版記事本編輯原始碼:
publicclassMain{
publicstaticvoidmain(String[]args){
System.out.println("哈囉!世界!");
}
}
如果直接如下編譯:
C:\workspace>javacMain.java
那麼就會編譯成功,不過,編譯器是使用哪種編碼來解譯原始碼呢?答案是作業系統預設編譯,正體中文Windows中,如果用記事本編輯原始碼,原始碼檔案預設用MS950儲存,而編譯器採用作業系統編碼編譯,所以就不用任何指定,就可以正確編譯。
同樣地,在預設編碼為UTF-8的Linux中,如果你用vim編輯原始碼,原始碼檔案是用UTF-8儲存,而編譯器採用作業系統編碼編譯,所以就不用任何指定,就可以正確編譯。
如果用記事本轉存為「Unicode」或「Unicodebigendian」編碼,那要如何編譯?答案是指定-encoding告知編譯器原始檔案的編碼:
C:\workspace>javac-encodingUTF-16Main.java
如果用舊記事本轉存為「UTF-8」編碼,那要如何編譯?答案是無法編譯,即使指定了-encoding為UTF-8也一樣…
C:\workspace>javac-encodingUTF-8Main.java
Main.java:1:illegalcharacter:\65279
?publicclassMain{
^
1error
在UTF-8中談過,因為Windows的記事本存成UTF-8時,會在檔首加上BOM,javac編譯器並不處理BOM,只會視為不合法字元,如果要將原始碼存為UTF-8,必須使用可存為檔首無BOM的編譯器,例如NotePad++。
如此指定-encoding為UTF-8進行編譯,就可以編譯成功(新版Windows記事本已經預設使用檔首無BOM的UTF-8儲存)。
在Windows中,如果用gcc編譯一個以Big5儲存的C原始碼:
#include
如果將C原始碼存為UTF-8再直接編譯,執行結果會出現亂碼:
C:\workspace>gccmain.c
C:\workspace>a
蝺刻陌?栀?
只是將字元的位元組改為另一組位元,所以編譯可以成功,但執行時Windows的Console預設使用MS950(也就是Big5相容),對這組位元並沒有對應實際可辨識的字元,所以就是亂碼,必須如下指定執行時期編碼為Big5:
C:\workspace>gcc-fexec-charset=BIG5main.c
C:\workspace>a
編譯成功
新版的Windows10可以藉由地區設定,將Console預設為UTF-8:
不同語言辨識或指定原始碼編碼的方式並不相同,可以進一步參考:
Java的字串
JVM預設編碼
Ruby的編碼
Python的編碼
JavaScript編碼基礎
甚至在不同環境中也會有不同方式,可參考:
JSP的轉譯
Rails的編碼
延伸文章資訊
- 1Day27 Python 基礎- 字符轉編碼操作 - iT 邦幫忙
回顧字符編碼的前世今生. ASCII 只能儲英文或特殊字符,只占一個字節,一個字節8bit,不能儲中文,所以才出現Unicode. Unicode 不管是中文或英文,都是占二個字節, ...
- 2編碼的意思|漢典“編碼”詞語的解釋
- 3編碼是什麼意思,編碼的解釋反義詞近義詞英文翻譯-國語詞典
將某種信息用規定的一組代碼來表示的過程。在電子計算機中將指令和數字實行編碼後,就適合於計算機上進行運算和操作。在遙控系統和通信系統中, ...
- 4Encoding - 編碼 - 國家教育研究院雙語詞彙
編碼是指人把輸入的外在訊息轉換成一種獨特的神經代碼(neural code),以便在人的記憶中加以處理。我們不論在感覺記憶、短期記憶或長期記憶中都有編碼的情形。
- 5解碼器- 維基百科,自由的百科全書