BOM是什么意思?

Y.E*_*E.P 3 encoding byte-order-mark

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

我读到一些文本编辑器在文件开头之前放置了BOM.它的意思是什么?

Jer*_*her 10

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

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

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

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

我的建议:注意它存在,永远不要故意使用它.

  • 为"注意它存在,从不故意使用它"+1. (2认同)

Dun*_*nes 5

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

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

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

请注意,Java 在读取 UTF-8 BOM 时存在问题,您必须手动处理这些字符(如果存在)(有关相关 Sun 错误的一些链接,请参阅读取 UTF-8 - BOM 标记)。


Jir*_*ika -1

今天,这只是表示“此文件采用 UTF-8 格式”。或者,“此文件采用 UTF-16 格式”。虽然在两种情况下它仍然是相同的 BOM 字符,但 BOM 的编码方式暗示了其余所有字符的编码方式。

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

否决后附录:

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

难怪 BOM 技术并不适合所有人。