【问题标题】:what is meant by BOM? [closed]BOM是什么意思? [关闭]
【发布时间】:2012-10-03 07:57:00
【问题描述】:

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

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

【问题讨论】:

  • 它的目的是告诉读者使用了哪种编码,以便可以对其进行解码。
  • 我假设添加 Java 标记是有原因的,即使 OP 没有明确引用它。 Java 在处理 Unicode 字符方面有一些特殊性,因此它可能会调整响应。
  • 为什么关闭?这是个好问题。而且 OP 可能需要包含 java 代码、api 等的答案,这就是 OP 添加java 标签的原因。

标签: encoding byte-order-mark


【解决方案1】:

BOM 代表Byte Order Mark。简而言之,BOM 是文件开头的标记,用于指示是最重要的字节还是最不重要的字节。

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

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

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

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

【讨论】:

  • +1 表示“注意它的存在,切勿故意使用它。”
  • 我完全同意 UTF-8 中 BOM 的无用性,但是您能否引用一个参考来说明 UTF8Y 的定义位置或 UTF8“不使用 BOM”的位置? Unicode 标准允许 UTF8 中的 BOM(但表明它们毫无意义),我在规范中也找不到对 UTF8Y 的引用。
  • 话虽如此,Google 为 UTF8Y 提供了许多结果。那么也许这是与纯规范的常见偏差?
  • @DuncanJones -- 我只从我的一位编辑(jEditNotepad++)那里知道 UTF8Y 这个词。根据this chart,UTF8 没有 BOM。 ER,后来它确实表明 BOM 是可选的,但对实际字节顺序没有影响。听起来 UTF8Y 是一个官方名称,将它与UTF8 without BOM.分开。
  • " UTF8 不使用 BOM,但有一种称为 UTF8Y(或 UTF with BOM)的变体,它在文件开头包含一些额外的字符。"名称是UTF-8 without BOM,文件中还包含一些额外的字符!这是什么意思?
【解决方案2】:

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

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

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

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

【讨论】:

  • +1 用于提醒 Java 问题。
  • 是的,浪费了一个下午才找到那个 :-) “这个问号还在吗?!
【解决方案3】:

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

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

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

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

【讨论】:

    【解决方案4】:

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

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

    投票后附录:

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

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

    【讨论】:

    • +1 从技术上讲,它会说 UTF-16LEUTF-16BE ;)
    • @PeterLawrey - 谢谢,是的。我有意简化主题。
    猜你喜欢
    • 2010-12-29
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2013-05-16
    • 2011-04-03
    • 2022-01-23
    相关资源
    最近更新 更多