BOM( byte-order mark ,UTF-8 HEADER)问题研究
程序员文章站
2022-03-03 13:50:00
...
什么是BOM (byte-order mark ):
在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。
UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF
。所以如果接收者收到以EF BB BF
开头的字节流,就知道这是UTF-8编码了。
Windows就是使用BOM来标记文本文件的编码方式的。
另外unicode网站的FAQ-BOM详细介绍了BOM。
UTF-
8编码的文件中,BOM占三个字节。如果用记事本把一个文本文件另存为UTF-8编码方式的话,用UE打开这个文件,切换到十六进制编辑状态就可以看到开
头的FFFE了。这是个标识UTF-8编码文件的好办法,软件通过BOM来识别这个文件是否是UTF-8编码,很多软件还要求读入的文件必须带BOM。可
是,还是有很多软件不能识别BOM。
Java中如何除去BOM:
byte[] b=s.substring(0,2).getBytes(‘UTF-8');
if(
(Integer.toHexString(b[0] & 0xFF).equals("ef"))
&& (Integer.toHexString(b[1] & 0xFF).equals("bb"))
&& (Integer.toHexString(b[2] & 0xFF).equals("bf"))
)
s=sb.toString().substring(1, sb.toString().length());
上一篇: oralce10g服务