2012-03-21 12 views
14

Ciao e grazie per aver letto il mio post.Compilare (javac) un codice sorgente Java con codifica UTF8 con una BOM

Il mio problema è il seguente: Voglio compilare un file sorgente Java con "javac" con questo file codificato in UTF-8 con una distinta base (il sistema operativo è WinXP).

Qui di seguito è quello che faccio:

1) Creare un file con "Blocco note" e scegliere la codifica UTF-8

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

2) Creare una classe Java in quel file e salvato il file come in 1)

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

3) Visualizzare la versione esadecimale del file (prima linea)

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

Nota: ef bb bf rappresenta l'UTF-8 codificato BOM (UTF-16 codificato BOM essendo FE FF).

4) Provare a compilare questo codice con "javac"

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

Nota: è la versione decimale del BOM.

La mia domanda è la seguente: come posso fare questo lavoro compilazione con:

  • mantenendolo codifica UTF-8
  • e mantenendo la distinta base?

Grazie per l'aiuto e cordiali saluti.

Léa

+4

Proprio così: devi rimuovere il BOM. Non ha business in UTF-8, quindi ovviamente è un errore. Questo è un bug Microsoft di vecchia data. Mai e poi mai messo una BOM in UTF-8 !!!!! – tchrist

+0

Ciao. La ringrazio per la risposta. Ho usato "Notepad ++" per codificare il file come "UTF8 senza BOM". Ora la compilazione del codice con "javac" funziona. –

+3

@tchrist [The Unicode Standard (pagina 30)] (http://www.unicode.org/versions/Unicode6.0.0/ch02.pdf) consente una distinta base in UTF-8 in modo da avere tutto il diritto di metterlo lì se lo desideri Perché tu vorresti è un'altra storia, ma 'javac' dovrebbe gestirlo. – ArtB

risposta

20

Tagliare la distinta e quindi utilizzare javac -encoding utf8 x.java

14

questo non è un problema con il vostro editor di testo, si tratta di un problema con javac! Le specifiche Unicode dicono che BOM è opzionale in UTF-8, non dice che è vietato! Se un BOM può essere presente, allora javac HAS lo gestisce, ma non lo fa. In realtà, l'utilizzo della distinta componenti in file UTF-8 è utile per distinguere un file codificato ANSI da un file codificato in Unicode.

La soluzione proposta per rimuovere il BOM è solo una soluzione e non la soluzione corretta.

Questo bug report indica che questo "problema" non sarà mai risolto: http://bugs.java.com/view_bug.do?bug_id=4508058

Dal momento che questa discussione è tra i primi 2 risultati di Google per la ricerca "javac BOM", me ne vado questa qui per futuri lettori .