BOM是什么意思?

时间:2012-10-12 13:27:20

标签: encoding byte-order-mark

BOM是什么意思?我试过阅读这篇文章,但还没有真正理解它是什么意思。

我读到一些文本编辑器在文件开头之前放置了BOM。这意味着什么?

4 个答案:

答案 0 :(得分:9)

BOM代表Byte Order Mark。简而言之,BOM是文件开头的标记,用于指示最重要的字节或最低有效字节是否应该首先出现。

它会导致很多问题,特别是对于UTF8。 UTF8不使用BOM,但有一个名为UTF8Y(或带有BOM的UTF)的变体,在文件的开头包含一些额外的字符。

使用UTF8编码类型发送UTF8Y文件会导致在文件开头发送一些额外的字节,并导致各种难以跟踪的问题,包括DOCTYPE无法正确解析一个IE或JSON文件无法解码。

当我没有仔细检查文件类型时,它已经被其他人的文件咬了几次。

我的建议:注意它存在,从不故意使用它。

答案 1 :(得分:4)

字节顺序标记允许程序确定如何读取Unicode数据。来自您的维基页面:

  

因为Unicode可以编码为16位或32位整数,所以从任意源接收这些编码的计算机需要知道整数编码的字节顺序。

对于UTF-8,如何读取字节没有歧义,因此通常省略BOM。对于UTF-16和UTF-32,有必要知道如何解释字节,并且BOM可以用于此目的。

请注意,Java在读取UTF-8 BOM时遇到问题,如果存在,您必须手动处理这些字符(有关相关Sun漏洞的链接,请参阅Reading UTF-8 - BOM marker)。

答案 2 :(得分:2)

我可能会介绍你已经知道的东西,但这里有......

要了解BOM的目的,您需要了解(至少在概念上)什么是endian-ness。

如果您正在处理单个字节(8个二进制位),则从右到左排序增加的重要性(就像读取正常的十进制数一样,如“19”)。只要您可以在单个字节中包含数字,这就足够简单了。一旦达到两个字节,就需要知道两个字节中哪一个更重要,哪个是大端或小端。大端意味着最低内存地址(或最左边,继续类比写入)包含更高的值 - 它继续西方十进制数的趋势。从历史上看,英特尔一直是小端,摩托罗拉一直是大端。 (我最近没看过,现在可能会有所不同。)

BOM只是一个标记,说明了解释数据字节顺序的方法。

答案 3 :(得分:-1)

今天,这只是说,"这个文件是UTF-8"。或者,"此文件采用UTF-16"。虽然在两种情况下它仍然是相同的BOM字符,但BOM的编码方式意味着所有其余的将被编码。

如果您不知道第一个字符是什么,则无法从中可靠地推断出文档编码 - 您必须从其他地方确定它,或者或多或少地猜测它。

post-downvote附录:

从历史上看,BOM有不同的用途 - 零宽度的空白字符(也就是说,像Unicode字符一样不可见,但仍然是一个字符)。 许多广泛使用的软件库(如.NET和Java)会自动或隐式地将BOM添加到书面文件甚至字节数组中,这通常会让人们认为他们没有使用BOM。当一堆这样的库在同一个文件的开头写入多个BOM时,这通常会适得其反,因为那时你的文件以非法或不需要的字符开头,零宽度不可破坏的空间;你检查时甚至都看不到它!

难怪BOM技术对每个人都没有好处。