2009-11-20 36 views
5

好吧,我正在尝试使用UTF8文本文件。我一直在努力争取作者为UTF8而投入的BOF字符,这使得我需要用到的任何东西来阅读包括序列化程序和其他文本阅读器的文件。UTF8文件字符的开头正在破坏串行器和阅读器

我得到一个领先的六个字节的数据:

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

回答

10

是的,这是两个物料清单。你编码成UTF-8两次,每次把一个伪-BOM,由于非常不幸的事实是:

Encoding.UTF8 

意味着“UTF-8与一个毫无意义的,无意义的U + FEFF坚持正面搞砸你的应用程序“。尝试改用

new UTF8Encoding(false) 

其中应该give you a less sucky version

+0

完美!这回答了我的问题。我能够在没有BOM的情况下编写文件。我用'UTF8Encoding(false)'用'Encoding.UTF8'替换了所有的位置。 – Nathan 2009-11-23 20:54:28

1

是的,这是一个BOM。

是的,一些较早的JDK有一个在UTF-8 BOM数据上爆炸的bug。他们中的两个甚至会混淆现代版本的Java。

我使用的解决方案是将推回流贴到前面并过滤掉。

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

1

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

你有两次相同的序列。

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