2009-11-20 22 views
5

OK, tôi đang cố gắng làm việc với các tệp văn bản UTF8. Tôi liên tục chiến đấu với các ký tự BOF mà người viết viết xuống cho UTF8, điều này thổi khá nhiều thứ tôi cần sử dụng để đọc tệp bao gồm cả bộ nối tiếp và các trình đọc văn bản khác.UTF8 Bắt đầu của các ký tự Tệp đang phá vỡ bộ nối tiếp và trình đọc

Tôi nhận được một lãnh đạo sáu byte dữ liệu:.

0xEF 
0xBB 
0xBF 
0xEF 
0xBB 
0xBF 

(bây giờ mà tôi đang nhìn vào nó, tôi nhận ra có hai nhân vật có Đó có phải là dấu hiệu UTF8 BOF Tôi gấp đôi mã hóa? nó)?

Lưu ý trình nối tiếp mã hóa thành UTF8, sau đó luồng bộ nhớ nhận chuỗi là UTF8, sau đó tôi ghi chuỗi vào tệp bằng UTF8 ... có vẻ như rất nhiều dự phòng. Suy nghĩ?

//I'm storing this xml result to a database field. (this one includes the BOF chars) 
using (MemoryStream ms = new MemoryStream()) 
{ 
    Utility.SerializeXml(ms, root); 
    xml = Encoding.UTF8.GetString(ms.ToArray()); 

} 


//later on, I would take that xml and then write it out to a file like this: 
File.WriteAllText(path, xml, Encoding.UTF8); 



public static void SerializeXml(Stream output, object data) 
{ 
    XmlSerializer xs = new XmlSerializer(data.GetType()); 
    XmlWriterSettings settings = new XmlWriterSettings(); 
    settings.Indent = true; 
    settings.IndentChars = "\t"; 
    settings.Encoding = Encoding.UTF8; 
    XmlWriter writer = XmlTextWriter.Create(output, settings); 
    xs.Serialize(writer, data); 
    writer.Flush(); 
    writer.Close(); 
} 

Trả lời

10

Vâng, đó là hai BOM. Bạn đang mã hóa sang UTF-8 hai lần và mỗi lần bổ sung thêm một pseudo-BOM, do thực tế vô cùng đáng tiếc rằng:

Encoding.UTF8 

có nghĩa là “UTF-8 với một vô nghĩa, vô nghĩa U + FEFF mắc kẹt vào phía trước để vít lên các ứng dụng của bạn ”. Thay vào đó, hãy thử sử dụng

new UTF8Encoding(false) 

nên give you a less sucky version.

+0

Hoàn hảo! Điều này đã trả lời câu hỏi của tôi. Tôi đã có thể viết các tập tin mà không có BOM. Tôi đã thay thế tất cả các vị trí bằng cách sử dụng 'Encoding.UTF8' bằng' UTF8Encoding (false) 'mới. – Nathan

1

Có đó là BOM.

Có một số JDK cũ hơn có lỗi phát sinh dữ liệu UTF-8 BOM. Và hai trong số họ sẽ gây nhầm lẫn ngay cả một phiên bản Java hiện đại.

Giải pháp mà tôi đã sử dụng là gắn một luồng tua ngược ở mặt trước và lọc nó ra.

Hoặc sử dụng phiên bản Java hiện đại hơn.

1

Chuỗi byte 0xEF 0xBB 0xBF là mã hóa UTF-8 của U + FEFF, là Unicode BOM (dấu thứ tự byte). Nó là không cần thiết trong UTF-8, nhưng rất quan trọng trong UTF-16 hoặc UTF-32.

Bạn có cùng một chuỗi hai lần.

Điều duy nhất để làm với chúng là bỏ qua và/hoặc xóa chúng.

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