2009-11-20 42 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中至關重要。

你有兩次相同的序列。

對他們唯一的好處是忽略和/或刪除它們。