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