5

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

我读到一些文本编辑器将 BOM 放在文件开头之前。它的用途是什么?

4

4 回答 4

13

BOM代表Byte Order Mark。简而言之,BOM文件开头的 is 标记指示是最高有效字节还是最低有效字节应该在前。

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

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

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

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

于 2012-10-12T13:33:52.900 回答
5

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

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

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

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

于 2012-10-12T13:33:52.633 回答
2

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

要了解 BOM 的目的,您需要了解(至少在概念上)什么是字节序。

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

BOM 只是一个标记,说明以哪种方式解释数据的字节顺序。

于 2012-10-12T13:44:35.520 回答
-1

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

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

投票后附录:

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

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

于 2012-10-12T13:33:33.680 回答