【发布时间】:2010-12-18 20:14:05
【问题描述】:
ANSI XML 文档中的 BOM 究竟是什么,应该将其删除吗? XML 文档应该使用 UTF-8 吗?谁能告诉我一个可以检测 BOM 的 Java 方法? BOM 由字符 EF BB BF 组成。
【问题讨论】:
ANSI XML 文档中的 BOM 究竟是什么,应该将其删除吗? XML 文档应该使用 UTF-8 吗?谁能告诉我一个可以检测 BOM 的 Java 方法? BOM 由字符 EF BB BF 组成。
【问题讨论】:
对于 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 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' 可以由 &#x0041; 表示),因此不一定需要避免数据丢失。
【讨论】:
不要在 utf-8 文件中插入 BOM:如果合并两个这样的文件,最终会在中间产生一个 BOM,这可能会破坏应用程序,或导致 xml 解析器抛出异常。
【讨论】:
操作:
谁能告诉我一个可以检测 BOM 的 Java 方法?
org.apache.commons.io.input.BOMInputStreamJavadocs:
此类检测这些字节,如果需要,可以自动跳过它们并将后续字节作为流中的第一个字节返回。
【讨论】: