2012-03-21 19 views
14

Witam i dziękuję za przeczytanie mojego wpisu.Kompilowanie (javac) kodu źródłowego kodu Java zakodowanego w UTF8 z BOMem

Mój problem jest następujący: Chcę skompilować plik źródłowy Java za pomocą "javac" z tym plikiem, który jest kodowany w UTF-8 za pomocą LM (OS to WinXP).

Poniżej jest to, co robię:

1) Utwórz plik z "Notatnika" i wybrać kodowanie UTF-8

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

2) Utwórz klasę Java w tym pliku i zapisaniu pliku jak w 1)

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

3) Wizualizacja wersji szesnastkową pliku (pierwsza linia)

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

Uwaga: EF BB BF jest UTF-8 LM (UTF-16 jest kodowana BOM FE FF).

4) Spróbuj skompilować ten kod z "javac"

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

Uwaga: jest wersja dziesiętną BOM.

Moje pytanie jest następujące: w jaki sposób mogę dokonać tej kompilacji pracy z:

  • utrzymanie go kodowanie UTF-8
  • i utrzymaniu LM?

Dziękuję za pomoc i pozdrawiam.

Léa

+4

To prawda: musisz usunąć BOM. Nie ma żadnej firmy w UTF-8, więc oczywiście jest to błąd. Jest to od dawna błąd Microsoftu. Nigdy nie umieszczaj BOM w UTF-8 !!!!! – tchrist

+0

Witaj. Dziękuję za Twoją odpowiedź. Użyłem "Notepad ++" do zakodowania pliku jako "UTF8 bez LM". Kompilacja kodu z "javac" teraz działa. –

+3

@tchrist [Standard Unicode (strona 30)] (http://www.unicode.org/versions/Unicode6.0.0/ch02.pdf) pozwala na zestawienie BOM w UTF-8, więc masz pełne prawo do umieszczenia tam jeśli sobie życzysz. Dlaczego chcesz to inna historia, ale 'javac' powinien sobie z tym poradzić. – ArtB

Odpowiedz

20

Trim LM, a następnie użyć javac -encoding utf8 x.java

14

To nie jest problem z edytora tekstu, to jest problem z javac! Specyfikacja Unicode mówi, że BOM jest opcjonalne w UTF-8, nie mówi, że jest zabronione! Jeśli BOM może być tam, to javac HAS, aby go obsłużyć, ale tak nie jest. W rzeczywistości użycie zestawu BOM w plikach UTF-8 jest przydatne do odróżnienia pliku zakodowanego ANSI od pliku zakodowanego w Unicode.

Proponowane rozwiązanie polegające na usunięciu BOM jest tylko obejściem, a nie właściwym rozwiązaniem.

Ten raport o błędzie wskazuje, że ten „problem” nigdy nie zostanie ustalona: http://bugs.java.com/view_bug.do?bug_id=4508058

Ponieważ ten wątek jest w 2 najwyższych wyników Google dla szukanej frazy „javac Bom”, wyjeżdżam to tutaj dla przyszłych czytelników .