2009-08-11 21 views
3

我已經使用下面的代碼來使用UTF-8編碼從數據集成字節數組得到的xml:爲什麼我在字節數組的開頭獲得一個額外的字符(點或圓點)?

private static byte[] fGetXmlBytes(DataTable lvDataTable) 
{ 
    XmlWriterSettings lvSettings = new XmlWriterSettings(); 
    lvSettings.Encoding = Encoding.UTF8; 
    lvSettings.NewLineHandling = NewLineHandling.Replace; 
    lvSettings.NewLineChars = String.Empty; 

    using(MemoryStream lvMemoryStream = new MemoryStream()) 
    using (XmlWriter lvWriter = XmlWriter.Create(lvMemoryStream, lvSettings)) 
    { 
    lvDataTable.WriteXml(lvWriter, XmlWriteMode.IgnoreSchema); 
    //Lines used during debugging 
    //byte[] lvXmlBytes = lvMemoryStream.GetBuffer(); 
    //String lsXml = Encoding.UTF8.GetString(lvXmlBytes, 0, lvXmlBytes.Length); 
    return lvMemoryStream.GetBuffer(); 
    } 
} 

我想要一個字節數組,因爲我隨後將數據傳遞給上工作的壓縮和加密例程字節數組。問題是我最終在xml的開頭添加了一個額外的字符。相反的:

<?xml version="1.0" encoding="utf-8"?><etc.... 

我得到

.<?xml version="1.0" encoding="utf-8"?><etc.... 

有誰知道爲什麼性格呢?有沒有辦法阻止角色被添加?或者輕易將它剝離?

科林

+2

請張貼額外字符的實際值。 – 2009-08-11 15:07:03

回答

13

你將不得不使用不發出前導碼的Encoding類。通過Encoding.UTF8返回的對象會發出一個序言,但你可以創建自己的UTF8Encoding不發出這樣的序言:

lvSettings.Encoding = new UTF8Encoding(false); 

的UTF-8序言是UNICODE byte order mark(U + FEFF)使用UTF-8編碼。 UNICODE字節順序標記的目的是指示流的16位代碼單元的字節順序(字節順序)。如果流中的初始字節是0xEF 0xFF,則該流是大端;否則,如果初始字節是0xFF 0xEF,則該流是小端。

使用UTF-8編碼的U + FEFF產生的字節數爲0xEF 0xBB 0xBF,有點諷刺意味,因爲UTF-8編碼爲8位字節序列,字節順序無關緊要。

+0

這是修復它。謝謝 – Colin 2009-08-11 15:34:53

+0

哇,這很微妙!你每天學習新的東西。 :-) – 2009-08-11 17:05:16

0

額外的字符是UTF-8序言。 AFAIK你不能阻止前導碼被寫入流中。但是,它真的很重要嗎?當字節數組被解析回XML時,前導碼將被正確解釋而沒有錯誤,所以你不妨將它留在那裏。

+0

我們基本上做了Response.Write(Encoding.UTF8.GetString((byte [])theBytes); Response.ContentType =「text/xml」;)。 瀏覽器解析XML,但它似乎不喜歡前言! – Colin 2009-08-11 15:41:24

0

我做的大多是與此代碼相同,它完美的作品:


MemoryStream data = new MemoryStream(1000); 
datatable.WriteXml(data); 
return data.toArray(); 
+0

Freddy, 謝謝。我嘗試過這個。它沒有放在序言中,但它沒有放在xml聲明或我的表名中,所以我認爲我會堅持使用XmlWriter Cololin Colin – Colin 2009-08-11 15:58:06

相關問題