2013-07-01 13 views
10

Se scrivo questo codice, ottengo questo come output -> Questa prima: ï» ¿ e poi le altre lineePrimo carattere della lettura dal file di testo: ï »¿

try { 
    BufferedReader br = new BufferedReader(new FileReader(
      "myFile.txt")); 

    String line; 
    while (line = br.readLine() != null) { 
     System.out.println(line); 
    } 
    br.close(); 

} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Come posso evitarlo?

+0

Immagino sia dovuto alla codifica. –

+3

Forse il BOM? https://en.wikipedia.org/wiki/Byte_order_mark –

+1

È [UTOM-8 BOM] (https://en.wikipedia.org/wiki/Byte_order_mark). –

risposta

1

Il problema potrebbe essere nella codifica utilizzata. provare questo:

BufferedReader in = new BufferedReader(new InputStreamReader(
     new FileInputStream("yourfile"), "UTF-8")); 
+0

Direi che * sicuramente * è la codifica;) – Joey

+2

Ho già provato. Al posto di ï »¿diventa '?' – Milton90

+0

Potrebbe essere a causa dell'IDE che stai utilizzando. A volte impostano la codifica predefinita del sistema operativo nativo – Tala

13

hai trovato la caratteri ï »¿sulla prima linea perché questa sequenza è la UTF-8 byte order mark (BOM). Se un file di testo inizia con una BOM, è probabile che sia stato generato da un programma Windows come Blocco note.

per risolvere il problema, abbiamo scelto di leggere il file in modo esplicito come UTF-8, al posto di qualsiasi codifica dei caratteri di default del sistema (US-ASCII, ecc):

BufferedReader in = new BufferedReader(
    new InputStreamReader(
     new FileInputStream("myFile.txt"), 
     "UTF-8")); 

Poi in UTF-8, la sequenza di byte ï »¿decodifica su un carattere, che è U + FEFF. Questo carattere è facoltativo - un file UTF-8 legale può o non può iniziare con esso. Quindi dovremo saltare il primo carattere solo se si tratta di U + FEFF:

in.mark(1); 
if (in.read() != 0xFEFF) 
    in.reset(); 

e ora è possibile continuare con il resto del codice.

Problemi correlati