BOM的基本概念編碼
在UCS 編碼中有一個叫作"ZERO WIDTH NO-BREAK SPACE"的字符,它的編碼是FEFF。而FFFE在UCS中是不存在的字符,因此不該該出如今實際傳輸中。UCS規範建議咱們在傳輸字節流前,先傳輸字符"ZERO WIDTH NO-BREAK SPACE"。這樣若是接收者收到FEFF,就代表這個字節流是Big-Endian的;若是收到FFFE,就代表這個字節流是Little-Endian的。所以字符"ZERO WIDTH NO-BREAK SPACE"又被稱做BOM。spa
UTF-8中的BOM.net
UTF-8不須要BOM來代表字節順序,但能夠用BOM來代表編碼方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EF BB BF。因此若是接收者收到以EF BB BF開頭的字節流,就知道這是UTF-8編碼了。code
UTF-8編碼的文件中,BOM佔三個字節。若是用記事本把一個文本文件另存爲UTF-8編碼方式的話,用UE打開這個文件,切換到十六進制編輯狀態就能夠看到開頭的FFFE了。這是個標識UTF-8編碼文件的好辦法,軟件經過BOM來識別這個文件是不是UTF-8編碼。ci
對於含BOM頭的UTF8文件,前三個字節是\xEF\xBF\xBD,某些軟件對於不包含BOM頭格式的文件識別存在問題,而有些軟件對於有BOM頭的文件解析有問題。因此這個問題要區別對待,咱們能夠在Notepad++裏進行轉換。string
C#寫文件時指定是否有BOMit
下面是C#在寫文件時指定BOM頭的代碼:io
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
var utf8WithBom =
new
System.Text.UTF8Encoding(
true
);
// 用true來指定包含bom
StreamWriter swr =
null
;
try
{
swr =
new
StreamWriter(
"okbase.txt"
,
false
, utf8WithBom);
swr.Write(
"hello okbase.net!"
);
}
catch
(Exception e)
{
}
finally
{
if
(swr !=
null
)
{
swr.Close();
swr.Dispose();
}
}
|
下面的代碼是不須要BOM:table
1
2
3
4
5
|
var utf8WithoutBom =
new
System.Text.UTF8Encoding(
false
);
using
(var sink =
new
StreamWriter(
"Foobar.txt"
,
false
, utf8WithoutBom))
{
sink.WriteLine(
"..."
);
}
|