2009-11-20 9 views
5

さて、私はUTF8テキストファイルで作業しようとしています。私は、ライターがUTF8のためにドロップしたBOFの文字と常に戦っています。これは、シリアライザや他のテキストリーダーを含むファイルを読むために必要なものを大いに吹き飛ばします。UTF8ファイル文字の先頭がシリアライザとリーダを壊しています

私は、データの先頭6つのバイトを取得しています:。

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

を(今、私はそれを見てることを、私はそこに2つの文字があります実現UTF8 BOFマーカーということです私は、コードする二だろうか?それ)?

シリアライザがUTF8にエンコードすると、メモリストリームがUTF8として文字列を取得し、UTF8でファイルに文字列を書き込みます...冗長性のようです。思考?

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

答えて

10

ええ、それは2つのBOMです。あなたは二回UTF-8にエンコードしていると、それぞれの時間が原因という極めて不幸なことに、疑似BOMを追加します:無意味な、無意味U + FEFFはフロントにこだわって

Encoding.UTF8 

は「UTF-8を意味し、あなたのアプリケーションを台無しにする "。代わりに、

new UTF8Encoding(false) 

give you a less sucky version)を使用してください。

+0

完璧!これは私の質問に答えました。私はBOMなしでファイルを書くことができました。 'Encoding.UTF8'を使ってすべての場所を新しい' UTF8Encoding(false) 'に置き換えました。 – Nathan

1

はい、BOMです。

はい古いJDKには、UTF-8 BOMデータで爆発したバグがありました。そして2人は現代版のJavaも混乱させます。

私が使用した解決策は、プッシュバックストリームを前面に貼り付け、それをろ過することでした。

Javaの最新バージョンを使用してください。

1

バイトシーケンス0xEF 0xBB 0xBFは、Unicode BOM(バイトオーダーマーク)であるU + FEFFのUTF-8エンコーディングです。 UTF-8では不要ですが、UTF-16またはUTF-32では非常に重要です。

あなたは同じシーケンスを2度持っています。

唯一良いことは、それらを無視したり削除したりすることです。

関連する問題