2009-11-12 70 views
24

我救了我的Java源文件中指定它的編碼類型爲UTF-8(使用記事本,在默認情況下記事本的編碼類型爲ANSI),然後我試圖使用編譯它:如何編譯編碼爲「UTF-8」的java源文件?

javac -encoding "UTF-8" One.java 

,但它給了一個錯誤信息「

One.java:1: illegal character: \65279 

?public class One { 

^ 
1 error 

是否有任何其他的方式,我可以編譯這個

這裏是源:

public class One { 
    public static void main(String[] args){ 
     System.out.println("HI"); 
    } 
} 

回答

42

您的文件被讀爲UTF-8,否則不會出現值爲「65279」的字符。 javac期待你的源代碼是在平臺默認的編碼,根據the javac documentation

如果未指定-encoding,則使用平臺默認的轉換器。

十進制65279是十六進制FEFF,它是Unicode Byte Order Mark (BOM)。在UTF-8中這是不必要的,因爲UTF-8總是被編碼爲一個八位字節流,並且沒有字節序問題。

即使沒有必要,記事本也喜歡粘貼在BOM中,但有些程序不喜歡找到它們。正如其他人所指出的,記事本並不是一個非常好的文本編輯器。切換到不同的文本編輯器幾乎肯定會解決您的問題。

+8

我會刪除「好」 – OscarRyz 2009-11-12 23:50:11

+18

@Oscar雷耶斯同意:記事本是不是一個非常文本編輯器? – 2009-11-12 23:51:21

+2

+1:這裏的替代方案:用記事本++,EditPlus的或者配偶或者,只有當你有個好把握上,在命令行編碼/建築/運行Java,Eclipse等 – BalusC 2009-11-12 23:51:30

0

工作在這裏很好,即使是在記事本編輯。故事的道德是,不要使用記事本。那裏可能有一個不可打印的字符,記事本插入或者快樂地隱藏起來。

+0

的BOM(字節順序標記)是一個非打印字符,這意味着它是指從編輯窗口隱藏。然而,任何優秀的文本編輯器都應該知道這個標記的存在並且尊重它所包含的任何信息。使用十六進制/二進制編輯器顯示允許您檢查BOM的構建方式。 BOM表不僅會導致與寫的不好或者非Unicode兼容工具的問題,並打破在BOM存在任何工具應該儘快解決(它的2015年在上帝的份...!)。以下是關於BOM的詳細信息:http://en.wikipedia.org/wiki/Byte_order_mark – 2015-05-19 13:57:14

+1

但我完全與整個「不使用記事本」的想法:) – 2015-05-19 14:00:20

4

我知道這是一個非常老的線程,但我遇到了與PHP相似的問題,而不是Java,Google將我帶到了這裏。我在Notepad ++(不是普通的記事本)上編寫PHP,並注意到每次調用包含文件時都會出現一個額外的白線。 Firebug顯示這些額外的行中有65279個字符。

實際上,主PHP文件和包含的文件都以UTF-8編碼。但是,Notepad ++也可以選擇編碼爲「無BOM的UTF-8」。這解決了我的問題。

底線:UTF-8編碼會在這裏和那裏插入額外的BOM字符,除非您指示編輯器使用不含BOM的UTF8。

20

在Notepad ++中打開文件並選擇編碼 - >轉換爲不帶BOM的UTF-8。

4

見下 例如,我們可以用一個程序(泰盧固語字)

計劃(UnicodeEx討論。JAVA)

class UnicodeEx { 
    public static void main(String[] args) { 
     double ఎత్తు = 10; 
     double వెడల్పు = 25; 
     double దీర్ఘ_చతురస్ర_వైశాల్యం; 
     System.out.println("The Value of Height = "+ఎత్తు+" and Width = "+వెడల్పు+"\n"); 
     దీర్ఘ_చతురస్ర_వైశాల్యం = ఎత్తు * వెడల్పు; 
     System.out.println("Area of Rectangle = "+దీర్ఘ_చతురస్ర_వైశాల్యం); 
    } 
} 

這同時節省爲 「UnicodeEx.java」 計劃和變化編碼爲 「統一」

**如何編譯**

javac的 - 編碼「unicode」UnicodeEx.java

如何執行

的Java UnicodeEx

高度= 10.0和寬度=價值25.0

矩形= 250.0

+0

我在使用UTF-8編碼的源文件時遇到了UTF-8 BOM的問題。轉換爲UTF-16 LE(帶有相應的物料清單)並將編碼unicode添加到javac命令行編譯好。 – MikeOnline 2017-10-19 00:57:16

0

的區我有同樣的問題。爲了解決這個問題,用十六進制編輯器打開文件,在文件的開頭找到三個「不可見」字節。我刪除了它們,編譯工作。

+0

那些「三個不可見的字節」就是所謂的BOM(字節順序標記):http://en.wikipedia.org/wiki/Byte_order_mark – 2015-05-19 13:52:33

7

這不是你的文本編輯器的問題,這是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」搜索,我在這裏留下這個對於未來的讀者。

+2

所有UTF-8流的一般Java更改都已歸還,這是由於[JDK- 6378911](https://bugs.openjdk.java.net/browse/JDK-6378911)影響一個期望讀取BOM代碼。它需要在'javac'本身修復。 – Joe 2015-01-20 11:07:03

0
  • 用寫字板或任何其他編輯器(記事本除外)打開您的文件。

  • 選擇保存類型爲文本文檔 - MS-DOS格式

  • 重新打開該項目

0

要與Linux用戶的解決方案擴展了現有的答案:

要立即刪除所有.java文件中的BOM,請轉至您的源目錄並執行

find -iregex '.*\.java' -type f -print0 | xargs -0 dos2unix

要求findxargsdos2unix被安裝,其應包括在最分佈。第一條語句以遞歸方式查找當前目錄中的所有.java文件,第二個語句使用dos2unix工具轉換其中的每個文件,該工具旨在轉換行尾,但也會刪除BOM。

行結束符轉換應該沒有影響,因爲它應該已經在Linux上的Linux \n格式,如果您正確地配置您的版本控制,但要警告它也這樣做,以防萬一您遇到那種罕見情況之一沒有打算。