UTF8Encoding與BOM | 黃偉榮的學習筆記 - - 點部落
文章推薦指數: 80 %
ToArray()); //do something //把檔案存起來 File.WriteAllText(filePath, result, Encoding.UTF8); }. 會照成輸入二次BOM的原因在於第5行與第17行, ...
前陣子團隊中有用XmlSerializer將物件轉成XML存檔後,上傳給另一家公司,對方卻一直回報我們XML有問題,用文字編輯器看格式都很正確,但用XML的編輯器卻會出錯,發現原來是BOM害的。
前陣子團隊中有用XmlSerializer將物件轉成XML存檔後,上傳給另一家公司,對方卻一直回報我們XML有問題,用文字編輯器看格式都很正確,但用XML的編輯器卻會出錯,發現原來是BOM害的。
用VisualStudio開啟,會出現未預期的XML宣告。
XML宣告必須是文件中的第一個節點,前面不得有空白字元的錯誤訊息(如圖一),可是怎麼看都沒有多餘的空白,後來用2進元編輯器開啟,發現檔案前多了一組BOM(Byteordermark)。
圖一用VisualStudio開啟檔案所發生的錯誤。
圖二多出的BOM。
NOTE:什麼是BOM位元組順序記號(byte-ordermark,BOM),是Unicode存放在檔案的最前面,用來記錄讀位元組的順序,如UTF-8是EFBBBF,詳情請看:維基百科-位元組順記號維基百科-位元組序 這是其中的程式碼片段using(varmemoryStream=newMemoryStream())
{
//XmlSerializer不給Encoding,其XML宣告會是UTF-16
varxmlWriter=newXmlTextWriter(memoryStream,Encoding.UTF8);
//空命名空間
XmlSerializerNamespacesxsn=newXmlSerializerNamespaces();
xsn.Add(String.Empty,String.Empty);
ser.Serialize(xmlWriter,sample,xsn);
varresult=Encoding.UTF8.GetString(memoryStream.ToArray());
//dosomething
//把檔案存起來
File.WriteAllText(filePath,result,Encoding.UTF8);
}
會照成輸入二次BOM的原因在於第5行與第17行,同時給了UTF8Encoding,但這不是最主要的原因,出錯的主因是二個地方都使用了有BOM的UTF8Encoding,查了MSDN,UTF8Encoding在建構式時,可以指定要不要輸出BOM,而System.Text.Encoding.UTF8是使用要輸出BOM的UTF8Encoding。
圖三MSDN的UTF8Encoding的說明。
System.Text.Encoding.UTF8的原始碼
{
get
{
if(utf8Encoding==null)
{
utf8Encoding=newUTF8Encoding(true);
}
returnutf8Encoding;
}
}
而System.Text.Encoding下的幾個靜態屬性UTF7、UTF8、Unicode、UTF32都是使用BOM為true的建構式,所以想不要BOM的話,請改用newUTF8Encoding(false)。
NOTE:
我同時也看了File.WriteAllText的原始碼,其實是我們雞婆,因為File.WriteAllText的多載,其中File.WriteAllText(stringpath,stringcontents),所用的預設Encoding就是newUTF8Encoding(false),所以我們不指定Encoding反而沒事。
參考資料
UTF8Encoding類別
回首頁
本頁段落
參考資料
延伸文章資訊
- 1位元組順序記號 - 维基百科
位元組順序記號(英語:byte-order mark,BOM)是位於碼點 U+FEFF 的統一碼字符的名称。當以UTF-16或UTF-32來將UCS/統一碼字符所組成的字串編碼時,這個字符被用來...
- 2What's the difference between UTF-8 and UTF-8 with BOM?
Short answer: In UTF-8, a BOM is encoded as the bytes EF BB BF at the beginning of the file. Long...
- 3UTF8Encoding與BOM | 黃偉榮的學習筆記 - - 點部落
ToArray()); //do something //把檔案存起來 File.WriteAllText(filePath, result, Encoding.UTF8); }. 會照成輸入二...
- 4How do I save file in UTF-8 without BOM - HESK.com
Download and install this powerful free text editor: Notepad++ · Open the file you want to verify...
- 5FAQ - UTF-8, UTF-16, UTF-32 & BOM - Unicode
Some byte oriented protocols expect ASCII characters at the beginning of a file. If UTF-8 is used...