UTF8文件字符的开头是破坏序列化器和&读者

时间:2009-11-20 22:33:30

标签: c# unicode utf-8 xml-serialization

好的,我正在尝试使用UTF8文本文件。我一直在努力争取作家为UTF8投入的BOF字符,它几乎可以用来读取文件,包括序列化器和其他文本阅读器。

我正在获得前六个字节的数据:

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

(现在我正在看它,我意识到那里有两个字符。那是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();
}

3 个答案:

答案 0 :(得分:10)

是的,这是两个BOM。你编码为UTF-8两次,每次添加一个伪BOM,由于非常不幸的事实:

Encoding.UTF8

意味着“UTF-8带有无意义,毫无意义的U + FEFF粘在前面以搞砸你的应用程序”。请尝试使用

new UTF8Encoding(false)

give you a less sucky version

答案 1 :(得分:1)

是的,这是一张BOM。

是的,一些较旧的JDK有一个漏掉了UTF-8 BOM数据的错误。其中两个甚至会混淆现代版本的Java。

我使用的解决方案是在前面粘上一个后推流并将其过滤掉。

或者使用更现代的Java版本。

答案 2 :(得分:1)

字节序列0xEF 0xBB 0xBF是U + FEFF的UTF-8编码,它是Unicode BOM(字节顺序标记)。在UTF-8中没有必要,但在UTF-16或UTF-32中是至关重要的。

你有两次相同的序列。

与他们唯一的好处是忽略和/或删除它们。