2013-07-01 17 views
10

Jeśli piszę ten kod, mam to jako wyjście -> Ten pierwszy ï» ¿ a następnie pozostałe liniepierwszy znak czytania z pliku tekstowego: i »¿

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(); 
} 

Jak Czy mogę tego uniknąć?

+0

Domyślam się, że to z powodu kodowania. –

+3

Może BOM? https://en.wikipedia.org/wiki/Byte_order_mark –

+1

To jest [BOM UTF-8] (https://en.wikipedia.org/wiki/Byte_order_mark). –

Odpowiedz

1

Problem może dotyczyć kodowania. spróbuj tego:

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

Powiedziałbym, że * zdecydowanie * to kodowanie;) – Joey

+2

Próbowałem już. W miejsce ï »¿staje się"? " – Milton90

+0

Może to być spowodowane używaniem IDE. Czasami ustawiają domyślne kodowanie natywnego systemu operacyjnego – Tala

13

otrzymujesz Postacie I »¿na pierwszej linii, ponieważ ta sekwencja jest UTF-8 byte order mark (BOM). Jeśli plik tekstowy zaczyna się od LM, prawdopodobnie został wygenerowany przez program Windows, taki jak Notatnik.

Aby rozwiązać problem, zdecydujemy się odczytać pliku jednoznacznie jako UTF-8, zamiast cokolwiek domyślne kodowanie znaków System (US-ASCII, etc.):

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

Następnie w UTF-8, sekwencja bajtów ï »¿dekoduje jeden znak, którym jest U + FEFF. Ta postać jest opcjonalna - legalny plik UTF-8 może lub nie może zaczynać się od niego. Więc pominiemy pierwszą postać tylko, jeśli jest to U + FEFF:

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

A teraz możesz kontynuować z resztą kodu.

Powiązane problemy