2009-11-12 6 views
24

Ho salvato il mio file sorgente Java che specifica che è tipo di codifica UTF-8 (utilizzando il Blocco note, per di Blocco note di default tipo di codifica è ANSI) e poi ho provato a compilare utilizzando:Come compilare un file sorgente Java che è codificato come "UTF-8"?

javac -encoding "UTF-8" One.java 

ma ha dato un messaggio di errore "

One.java:1: illegal character: \65279 

?public class One { 

^ 
1 error 

c'è un altro modo, posso compilare questo

Qui è la fonte:?

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

risposta

42

Il file è letto come UTF-8, altrimenti un carattere con valore "65279" non potrebbe mai apparire. javac si aspetta il codice sorgente per essere nella codifica piattaforma predefinita, in base alle the javac documentation:

Se -encoding non è specificato, il convertitore piattaforma predefinita viene utilizzato.

Il numero decimale 65279 è FEFF esadecimale, ovvero Unicode Byte Order Mark (BOM). Non è necessario in UTF-8, perché UTF-8 è sempre codificato come flusso ottetto e non ha problemi di endianness.

Blocco note che si blocca nelle distinte materiali anche quando non sono necessarie, ma alcuni programmi non amano trovarli. Come altri hanno sottolineato, Blocco note non è un editor di testo molto buono. Passare a un altro editor di testo risolverà quasi certamente il tuo problema.

+8

Rimuoverei il "buono" – OscarRyz

+18

@Oscar Reyes: Blocco note non è un editor di testo? –

+2

+1: ecco l'alternativa: usa notepad ++, editplus o consorts o, solo se hai una buona conoscenza di codifica/costruzione/esecuzione java a linea di comando, un IDE come Eclipse – BalusC

0

funziona bene qui, anche edito in Blocco note. Morale della storia è, non usare Blocco note. È probabile che ci sia un carattere non stampabile in quel Blocco note che si sta inserendo o nascondendosi felicemente da te.

+0

La distinta base (byte) è un carattere non stampabile, il che significa che deve essere nascosta dalla finestra di modifica. Qualsiasi buon editor di testi dovrebbe comunque essere consapevole della presenza di questo marchio e onorare le informazioni che contiene. Usando un editor in formato esadecimale/binario è possibile verificare come viene costruito il BOM. Il BOM causa solo problemi con strumenti mal scritti o non compatibili con unicode, e qualsiasi strumento che si rompe in presenza di una BOM dovrebbe essere risolto al più presto (è il 2015 per l'amor di dio ...!). Ecco ulteriori informazioni sul BOM: http://en.wikipedia.org/wiki/Byte_order_mark –

+1

Ma sono totalmente d'accordo con l'idea di "non usare Blocco note" :) –

4

So che questo è un thread molto vecchio, ma ho riscontrato un problema simile con PHP anziché con Java e Google mi ha portato qui. Stavo scrivendo PHP su Notepad ++ (notepad Notepad) e ho notato che una riga bianca extra appariva ogni volta che chiamavo un file include. Firebug ha mostrato che c'era un personaggio 65279 in quelle linee extra.

In realtà sia il file PHP principale che i file inclusi sono stati codificati in UTF-8. Tuttavia, Notepad ++ ha anche un'opzione per codificare come "UTF-8 senza BOM". Questo ha risolto il mio problema.

Bottom line: la codifica UTF-8 inserisce qui e là questo carattere BOM extra a meno che non si imponga al proprio editor di utilizzare UTF8 senza BOM.

20

Aprire il file in Notepad ++ e selezionare Codifica -> Converti in UTF-8 senza BOM.

4

vedi sotto Per esempio possiamo discutere con un programma (parole del Telugu)

programma (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 = "+దీర్ఘ_చతురస్ర_వైశాల్యం); 
    } 
} 

Questo è il programma, mentre il risparmio come "UnicodeEx.java" e il cambiamento di codifica a "unicode"

** Come compilare **

javac - codifica "unicode" UnicodeEx.java

Come concludere

java UnicodeEx

Il valore di Height = 10.0 e Width = 25,0

Area del rettangolo = 250.0

+0

Ho avuto problemi con i file di origine codificati UTF-8 con un BOM UTF-8. La conversione in UTF-16 LE (con BOM corrispondente) e l'aggiunta di unicode alla codifica della riga di comando javac sono state corrette. – MikeOnline

0

Ho avuto lo stesso problema. Per risolverlo ha aperto il file in un editor esadecimale e trovato tre byte "invisibili" all'inizio del file. Li ho rimossi e la compilazione ha funzionato.

+0

Quei "tre byte invisibili" sono quelli che vengono chiamati BOM (Byte Order Mark): http://en.wikipedia.org/wiki/Byte_order_mark –

7

Questo non è un problema con l'editor di testo, è 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 .

+2

La modifica generale di Java per tutti gli stream UTF-8 è stata annullata a causa di [JDK- 6378911] (https://bugs.openjdk.java.net/browse/JDK-6378911) che influisce sul codice che si aspetta di leggere la BOM. Dovrebbe essere corretto in 'javac' stesso. – Joe

0
  • Aprire il file con WordPad o qualsiasi altro editor tranne Blocco note.

  • tipo selezionare Salva con nome come documento di testo - MS-DOS Format

  • riaprire il progetto

0

Per estendere le risposte esistenti con una soluzione per gli utenti Linux:

Per rimuovere il DB in tutti i file .java in una sola volta, vai alla directory di origine ed esegui

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

Richiede find, xargs e dos2unix per essere installato, che dovrebbe essere incluso nella maggior parte delle distribuzioni. La prima affermazione trova tutti i file .java nella directory corrente in modo ricorsivo, il secondo li converte con lo strumento dos2unix, che serve a convertire le terminazioni di linea, ma rimuove anche il BOM.

La conversione di terminazioni di riga non dovrebbe avere alcun effetto poiché dovrebbe già essere nel formato Linux \n su Linux se si configura correttamente il controllo di versione ma si avverte che lo fa anche nel caso in cui si abbia uno di quei rari casi in cui non è destinato.

Problemi correlati