2012-03-21 100 views
14

您好,感謝您閱讀我的文章。用BOM編譯(javac)UTF8編碼的Java源代碼

我的問題如下:我想編譯一個帶有「javac」的Java源文件,該文件是用BOM(操作系統爲WinXP)編碼的UTF-8。

下面是我做的:

1)創建一個文件用「記事本」,然後選擇UTF-8編碼

dos> notepad Test.java 
"File -> Save as..." 
File name : Test.java 
Save as type: All Files 
Encoding : UTF-8 
Save 

2)創建該文件中的Java類,並保存文件像1)

public class Test 
{ 
    public static void main(String [] args) 
    { 
     System.out.println("This is a test."); 
    } 
} 

3)可視化的文件的十六進制版本(第一行)

dos> xxd Test.java | head -1 
0000000: efbb bf70 7562 6c69 6320 636c 6173 7320 ...public class 

注: EF BB BF是UTF-8編碼的BOM(的UTF-16編碼BOM是FE FF)。

4)嘗試編譯這段代碼 「的javac」

dos> javac -encoding utf8 Test.java 
Test.java:1: illegal character: \65279 
?public class Test 
^ 
1 error 

注:是BOM的十進制版本。

我的問題是:我怎樣才能使這個編譯工作:

  • 保持它的UTF-8編碼
  • 並保持BOM?

謝謝你的幫助和問候。

LEA

+4

是的:您必須刪除BOM。它在UTF-8上沒有任何業務,所以當然這是一個錯誤。這是一個長期存在的微軟錯誤。永遠不要把BOM放在UTF-8中!!!!! – tchrist 2012-03-21 20:56:42

+0

你好。謝謝您的回答。 我使用「Notepad ++」將文件編碼爲「無BOM的UTF8」。 現在可以使用「javac」編譯代碼。 – 2012-03-22 09:20:09

+3

@tchrist [Unicode標準(第30頁)](http://www.unicode.org/versions/Unicode6.0.0/ch02.pdf)支持UTF-8中的BOM,因此您完全有權將它放在那裏如果你願意的話。爲什麼你想要另一個故事,但'javac'應該處理它。 – ArtB 2013-07-09 18:46:09

回答

20

修剪BOM,然後用javac -encoding utf8 x.java

14

這是不是與你的文本編輯器有問題,這是一個問題的javac! Unicode規範說BOM是UTF-8中的唯一選項,但並未說它是禁止的! 如果物料清單可以在那裏,那麼javac必須處理它,但它不。實際上,在UTF-8文件中使用BOM對於區分ANSI編碼文件和Unicode編碼文件非常有用。

建議的刪除BOM解決方案只是一種解決方法,而不是適當的解決方案。

這個bug報告指出,這個「問題」將永遠不會被固定:http://bugs.java.com/view_bug.do?bug_id=4508058

由於該線程處於頂部2谷歌搜索結果的「javac的BOM」搜索,我在這裏留下這個對於未來的讀者。