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(
"..."
);
}
|