BOM

BOM 代表了 Byte Order Mask

它是什么

BOM表示了字节存放的顺序。

为什么需要它

这个说来话长,简单的说,就像现在我们写字是从左到右,而古代是从右到左的顺序。但是,如果一个国外人来看一份资料,他该从左开始还是从右开始看呢?

回到字节编码,如果一个字符,使用了多个字节来存储,

例如, 的unicode编码是6109,它是16进制的,所以61【高位】占用一个字节,09【地位】占用一个字节。那么我写成下面的两种格式,到底这两种格式是否表示同一个字符呢?

字节1 字节2
61 09
09 61

表1

那么如果我规定在一串字符的最前面加上一个标识,请看下表:

标识 编码
00 00 FE FF UTF-32, big-endian
FF FE 00 00 UTF-32, little-endian
FE FF UTF-16, big-endian
FF FE UTF-16, little-endian
EF BB BF UTF-8

表2

那么现在回到表1,我们加上一个标识,那么就可以区分知道了,下面两种表示都是同一个字符。

标识 字节1 字节2
FF FE 61 09
FE FF 09 61

表3

UTF-8也有BOM?

我们前面说过UTF-8字符集, 这货不一般,而且喜欢凑热闹。

事实上,UTF-8有没有BOM都可以的,也就说,BOM对于UTF-8不是必须的,因为,前面不是说过,它是使用第一字节的前面的1的个数表示有多少位,后面以10表示该字节存储了部分数据。

UTF-8加上BOM有什么好处呢

有个BOM,就相当于它有一个胸牌了,别人一看就知道它是UTF-8了;而且,由于UTF-8兼容ASCII,如果一个文本里全是ASCII字符,怎么区分ASCII编码还是UTF-8编码呢?

明明都全是ASCII了,那还有什么必要区分它俩呢? 这个需要提及字符编码检测的方法了,除了上表2里的标识,其它字符编码很容易分不清楚,正所谓傻傻分不清楚。

那么浏览器或者文本编辑器怎么选择正确的编码来显示内容呢? 一般检测方法就是直接读取文本的前1024个字节,看看符合哪种字符集编码。那么如果前面全是ASCII编码,但是后面又有UTF-8编码,就会显示为乱码。

再者,我们把excel转换成csv格式时,中文基本都是乱码。如果我们使用文本编辑器把csv格式的数据另存为UTF-8 with BOM的字符集编码时,就可以正常显示了。这就是BOM带来的好处。


Author: Arthur Li
Email: [email protected]
欢迎转载和关注微信号: INFAer

results matching ""

    No results matching ""