November 16, 2010

去除UTF-8 BOM的方法

今天在處理一份格式為UTF-8的XML資料時,用XDocument去剖析這份XML,明明格式"看起來"就沒問題,但是一執行XDocument.Parse就出現"在根層次的資料無效。 第 1 行,位置 1。"的錯誤訊息,可是第一行第一個字元不就是個小於符號(<)嗎?。研究了一下發現了這錯誤訊息很有可能是所剖析的XML其二進位資料被塞入了BOM (what is BOM?)
檢查了一下這份XML發現的確被塞入了三個bytes的UTF-8 BOM

接下來就是想辦法把它拿掉了,以下提供一範例參考自http://efreedom.com/Question/1-2070661/Change-XML-String-XDocumentParse-Reads並做修改
                byte[] bytes = Encoding.UTF8.GetBytes(xml);
                if (bytes[0] == 0xef && bytes[1] == 0xbb && bytes[2] == 0xbf)
                {
                    string byteOrderMarkUtf8 = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
                    xml = xml.Remove(0, byteOrderMarkUtf8.Length);
                }
 與參考網址不同的地方是if判斷式的寫法,因為實測之後發現若XML不含BOM字元的話XML的第一個字元會被截掉而造成錯誤,故改以檢查byte方式進行判斷
其中的Encoding.UTF8.GetPreamble() 用意是在取得UTF-8 BOM的二進位字元(EF BB BF)

No comments: