C#寫UTF8文件時指定是否含BOM頭

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( "..." );
}
相關文章
相關標籤/搜索