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文件都应以序言开头。