2013-07-01 29 views
10

Nếu tôi viết mã này, tôi có được điều này là đầu ra -> Đây đầu tiên: ï» ¿ và sau đó các dòng khácnhân vật đầu tiên của việc đọc từ tập tin văn bản: ï »¿

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

thế nào tôi có thể tránh nó không?

+0

Tôi đoán là do mã hóa. –

+3

Có lẽ BOM? https://en.wikipedia.org/wiki/Byte_order_mark –

+1

Đây là [UTF-8 BOM] (https://en.wikipedia.org/wiki/Byte_order_mark). –

Trả lời

1

Sự cố có thể sử dụng mã hóa. thử điều này:

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

Tôi muốn nói * chắc chắn * là mã hóa;) – Joey

+2

Tôi đã thử. Thay cho ï »¿trở thành '?' – Milton90

+0

Có thể là do IDE bạn đang sử dụng. Đôi khi, họ đặt mã hóa mặc định của hệ điều hành gốc – Tala

13

Bạn đang nhận được những nhân vật ï »¿trên dòng đầu tiên bởi vì chuỗi này là UTF-8 byte order mark (BOM). Nếu một tập tin văn bản bắt đầu bằng một BOM, có khả năng nó được tạo ra bởi một chương trình Windows như Notepad.

Để giải quyết vấn đề của bạn, chúng tôi chọn để đọc các tập tin một cách rõ ràng như UTF-8, thay vì bất cứ điều gì mặc định mã hóa ký tự hệ thống (US-ASCII, vv):

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

Sau đó, trong UTF-8, chuỗi byte ï »¿giải mã thành một ký tự, đó là U + FEFF. Ký tự này là tùy chọn - một tệp UTF-8 hợp pháp có thể hoặc không thể bắt đầu bằng nó. Vì vậy, chúng tôi sẽ bỏ qua ký tự đầu tiên chỉ khi đó là U + FEFF:

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

Và bây giờ bạn có thể tiếp tục với phần còn lại của mã.

Các vấn đề liên quan