0%

什麼是BOM(Byte-order mark)?

最近開發了一支收集資訊然後將資料轉成Json檔案給其它單位讀取,但收到對口單位回報Json格式不正確。但我將檔案內容貼到線上的Json解析網站,或是自己肉眼判斷都覺得格式沒問題,所以執行了一次對方的解析程式,錯誤訊息如下。

在字串0的位置有錯誤

/images/20180823/1.png

打開我提供的檔案,字串0也就是最前面感覺很正常…

/images/20180823/2.png

接著我將這段錯誤訊息貼Notepad++,轉成Hex碼來看看究竟是藏了什麼東西

/images/20180823/3.png

#什麼是BOM

ef bb bf拿去Google最後查到了Wiki-位元組順序記號

節錄Wiki

位元組順序記號(英語:byte-order mark,BOM)是位於碼點U+FEFF統一碼字元的名稱。當以UTF-16UTF-32來將UCS/統一碼字元所組成的字串編碼時,這個字元被用來標示其位元組序。它常被用來當做標示檔案是以UTF-8UTF-16UTF-32編碼的記號。

#解法

而會塞入位元組序是因為在寫檔案時這樣指定編碼

1
2
3
4
5
6
using (StreamWriter file = new StreamWriter(
new FileStream(path,FileMode.OpenOrCreate,FileAccess.Write),
Encoding.UTF8))
{
.....
}

只要將寫改改成 new UTF8Encoding(false) 即可

1
2
3
4
5
6
using (StreamWriter file = new StreamWriter(
new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write),
new UTF8Encoding(false)))
{
.....
}