2009-11-20 2 views
5

Okay, ich versuche, mit UTF8 Textdateien zu arbeiten. Ich kämpfe ständig gegen die BOF-Zeichen, die der Autor für UTF8 eingibt, was so ziemlich alles in die Luft jagt, was ich brauche, um die Datei einschließlich der Serialisierer und anderer Textleser zu lesen.UTF8 Anfang der Datei Zeichen brechen Serializer und Leser

Ich bin ein führendes sechs Bytes von Daten zu erhalten.

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

(jetzt, dass ich es bin auf der Suche, ich weiß, es gibt es zwei Zeichen ist, dass der UTF8 BOF Marker Ist ich Codierung verdoppeln? es)?

Beachten Sie, dass der Serializer zu UTF8 codiert, dann erhält der Speicher-Stream eine Zeichenfolge als UTF8, dann schreibe ich die Zeichenfolge in die Datei mit UTF8 ... scheint wie eine Menge Redundanz. Gedanken?

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

Antwort

10

Ja, das sind zwei Stücklisten. Sie kodiert in UTF-8 zweimal und jedes Mal, fügt einen Pseudo-BOM, aufgrund der extrem bedauerlichen Tatsache, dass:

Encoding.UTF8 

bedeutet „UTF-8 mit einem sinnlos, sinnlos U + FEFF nach vorne stecken um deine Anwendungen zu vermasseln ". Versuchen Sie stattdessen mit

new UTF8Encoding(false) 

, die give you a less sucky version sein sollte.

+0

Perfekt! Das hat meine Frage beantwortet. Ich konnte die Dateien ohne die Stückliste schreiben. Ich ersetzte alle Orte mit 'Encoding.UTF8' durch neue' UTF8Encoding (false) '. – Nathan

1

Ja, das ist eine Stückliste.

Ja, einige ältere JDKs hatten einen Fehler, der UTF-8 BOM-Daten in die Luft jagte. Und zwei von ihnen werden sogar eine moderne Version von Java verwirren.

Die Lösung, die ich verwendete, war, einen Pushback-Stream auf der Vorderseite anzubringen und herauszufiltern.

Oder verwenden Sie eine modernere Version von Java.

1

Die Bytefolge 0xEF 0xBB 0xBF ist die UTF-8-Codierung von U + FEFF, die die Unicode-BOM (Byte Order Mark) darstellt. Es ist unnötig in UTF-8, aber entscheidend in UTF-16 oder UTF-32.

Sie haben die gleiche Sequenz zweimal.

Die einzige gute Sache mit ihnen zu tun ist ignorieren und/oder löschen Sie sie.