【问题标题】:What is XML BOM and how do I detect it?什么是 XML BOM 以及如何检测它?
【发布时间】:2010-12-18 20:14:05
【问题描述】:

ANSI XML 文档中的 BOM 究竟是什么,应该将其删除吗? XML 文档应该使用 UTF-8 吗?谁能告诉我一个可以检测 BOM 的 Java 方法? BOM 由字符 EF BB BF 组成。

【问题讨论】:

    标签: java xml


    【解决方案1】:

    对于 ANSI XML 文件,它实际上应该被删除。如果你想使用 UTF-8,你真的不需要它。只有 UTF-16 和 UTF-32 才需要。

    字节顺序标记(或 BOM)是一个 特殊标记添加在非常 编码的 Unicode 文件的开头 在 UTF-8、UTF-16 或 UTF-32 中。它被使用 指示文件是否使用 大端或小端字节 命令。 BOM 对于 UTF-16 是强制性的 和 UTF-32,但它是可选的 UTF-8。

    (来源:https://www.opentag.com/xfaq_enc.htm#enc_bom

    关于如何在java中检测到这个问题。

    请检查此问题的以下答案:Java : How to determine the correct charset encoding of a stream

    基本上只是自己读取前几个字节,然后确定您是否可能找到了 BOM。

    【讨论】:

    • 感谢您的出色回答。因为我希望文件是 UTF-8,所以我只是使用以下内容忽略前 3 个字符: String file1sub = getXMLContents(file1).substring(3);
    • @jitter - 我不确定您对 BOM 的引用来自哪里。 XML 不需要 UTF-16 或 UTF-32 文档中的 BOM - 解析器应该在没有 BOM 的情况下进行管理。 XML 编码检测:w3.org/TR/REC-xml/#sec-guessing 否则,对 BOM 的要求取决于域。 Unicode.org BOM 常见问题解答:unicode.org/faq/utf_bom.html#BOM
    • 这解释了为什么 Notepad++ 允许您将新文件的默认设置为“UTF-8 without BOM”
    【解决方案2】:

    字节顺序标记很可能是以下字节序列之一:

         UTF-8 BOM: ef bb bf 
      UTF-16BE BOM: fe ff 
      UTF-16LE BOM: ff fe 
      UTF-32BE BOM: 00 00 fe ff 
      UTF-32LE BOM: ff fe 00 00 
    

    这些是 Unicode 代码点 U+FEFF 的各种编码形式。这可以使用'\uFEFF' 表示为Java char 文字(Java char 值是隐式 UTF-16)。由于 U+FEFF 不在大多数编码中,因此此 BOM 代码点不可能由它们编码。 (More on encoding the BOM using Java here.)

    对于 BOM 和 XML,它们是可选的(另请参阅 Unicode BOM FAQ)。如果在声明中指定了编码,则检测 XML 中的编码相对简单。始终确保 XML 声明 (<?xml version="1.0" encoding="UTF-8"?>) 与用于编写文档的编码相匹配。如果您对此要求严格,解析器应该能够正确解释您的文档。 (XML spec on encoding detection.)

    我提倡尽可能使用 Unicode 编码(另请参阅10 Commandments of Unicode)。也就是说,XML 允许通过转义实体表示任何 Unicode 字符(例如,'A' 可以由 A 表示),因此不一定需要避免数据丢失。

    【讨论】:

    • »XML 允许通过转义实体表示任何 Unicode 字符« – 好吧,除非您需要 CDATA 部分 ;-)
    【解决方案3】:

    不要在 utf-8 文件中插入 BOM:如果合并两个这样的文件,最终会在中间产生一个 BOM,这可能会破坏应用程序,或导致 xml 解析器抛出异常。

    【讨论】:

    • 啊。有趣的提示。我从来没想过这点。幸运的是,合并 XML 文件并不常见。
    • 那么 UTF-16LE 文件中的 BOM 呢?
    • 您不应该将 XML 文件合并为简单的文本文件。每个 XML 文件都应该以序言开头。
    【解决方案4】:

    操作:

    谁能告诉我一个可以检测 BOM 的 Java 方法?

    org.apache.commons.io.input.BOMInputStreamJavadocs:

    此类检测这些字节,如果需要,可以自动跳过它们并将后续字节作为流中的第一个字节返回。

    【讨论】:

    • 我不确定这对回答“什么是 XML BOM 以及如何检测它?”问题有什么帮助
    • @Matt - 我从 Javadocs 复制了描述。希望对您有所帮助。
    猜你喜欢
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 2021-11-12
    • 2022-01-10
    • 2015-03-13
    相关资源
    最近更新 更多