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

对于ANSI XML文件,实际上应该将其删除。如果您想使用UTF-8,则不需要它。仅对于UTF-16和UTF-32才需要。

The Byte-Order-Mark (or BOM), is a
special marker added at the very
beginning of an Unicode file encoded
in UTF-8, UTF-16 or UTF-32. It is used
to indicate whether the file uses the
big-endian or little-endian byte
order. The BOM is mandatory for UTF-16
and UTF-32, but it is optional for
UTF-8.


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

请检查以下有关此问题的答案:Java:如何确定流的正确字符集编码,如果现在要自己确定BOM(风险由您自己承担),请检查此代码,例如Java技巧:如何读取文件和自动指定正确的编码。

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

感谢您的出色回答。因为我期望文件为UTF-8,所以我只是使用类似以下内容忽略前三个字符:String file1sub = getXMLContents(file1).substring(3);

@jitter-我不确定您的BOM报价来自何处。 XML不需要UTF-16或UTF-32文档中的BOM-解析器不应该管理。 XML编码检测:w3.org/TR/REC-xml/#sec-guessing否则,对BOM的要求取决于域。 Unicode.org BOM常见问题解答:unicode.org/faq/utf_bom.html#BOM

这就解释了为什么Notepad ++允许您将新文件的默认设置设置为"不带BOM的UTF-8"

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

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表代码点不可能由它们编码。 (有关在此处使用Java编码BOM的更多信息。)

当涉及到BOM和XML时,它们是可选的(另请参见Unicode BOM FAQ)。如果在声明中指定了编码,则XML编码的检测相对简单。始终确保XML声明()与用于编写文档的编码匹配。如果您对此严格,解析器应该能够正确解释您的文档。 (有关编码检测的XML规范。)

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

XML允许通过转义实体表示任何Unicode字符-很好,除了您需要CDATA部分;-)

OP:

Can anyone tell me a Java method that will detect the BOM?

org.apache.commons.io.input.BOMInputStream Javadocs:

This class detects these bytes and, if required, can automatically skip them and return the subsequent byte as the first byte in the stream.

我不确定这对回答"什么是XML BOM和如何检测它"有帮助吗?

@Matt-我从Javadocs复制了描述。希望能有所帮助。

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

啊有趣的提示。我从来没想过这点。幸运的是,合并XML文件并不常见。

那么UTF-16LE文件中的BOM表又如何呢?

您永远不应将XML文件合并为简单的文本文件。每个XML文件都应以序言开头。