字节顺序标记(ByteOrderMark)BOM

概述

之前我们整理了大端和小端 和 字符编码 ,知道对于多字节的数据会存在不同机器之间的存储问题。对于整形我们知道可以通过网络字节序进行传输,但是对于不同编码的字符串我们该怎么办呢?

其实字符串就是一连串的内存数据,而内存数据我们可以看成一个数组,对于传送就是把数组中的数据按个发送,发送过程并不会影响数据。但是不同机器之前对数据的解释有可能不一致。而BOM就是对数据怎么解释的一个标记。

1、BOM的含义及其实现

BOM(byte-order mark),即字节顺序标记,它是插入到以UTF-8、UTF16或UTF-32编码的数据开头的特殊标记,用来识别数据的编码类型

对于UTF-8来说,BOM并不是必须的,因为BOM用来标记多字节编码的编码类型和字节顺序(big-endian或little-endian),UTF-8中有的字符是单字节,所以没有顺序而言。

编码表中定义一个字符U+FEFF,它并没有实际对应的符号。字符U+FEFF如果出现在字节流的开头,则用来标识该字节流的字节序,是高位在前还是低位在前。

在绝大多数编辑器中都看不到BOM字符,因为它们能理解Unicode,去掉了读取器看不到的题头信息。若要查看某个Unicode文件是否以BOM开头,可以使用十六进制编辑器。但对于 PHP来说,BOM是个大麻烦。PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。

2、不同编码的字节顺序标记

字节顺序标记(ByteOrderMark)BOM_第1张图片

图中的含义为:
UTF-8编码的数据,数据开头会以0xEF BB BF开头
UTF-16编码的以大端模式存储的数据,会以0xFE FF开头
UTF-16编码的以小端模式存储的数据,会以0xFF FE开头

3、其它知识

为了识别 Unicode 文件,Microsoft 建议所有的 Unicode 文件应该以U+FEFF字符开头。这作为一个“特征符”或“字节顺序标记(byte-order mark,BOM)”来识别文件中使用的编码和字节顺序。

Linux/UNIX 并没有使用 BOM,因为它会破坏现有的 ASCII 文件的语法约定。

不同的编辑工具对BOM的处理也各不相同。使用Windows自带的记事本将文件保存为UTF-8编码的时候,记事本会自动在文件开头插入BOM(虽然BOM对UTF-8来说并不是必须的),但是editplus就不会这样做。

感谢大家,我是假装很努力的YoungYangD(小羊)

参考资料:
http://blog.sina.com.cn/s/blog_6aefe4250101agyr.html
https://blog.csdn.net/sea_shore/article/details/22672539

你可能感兴趣的:(互联网)