什么是XML BOM以及如何检测它?

时间:2009-11-20 18:11:50

标签: java xml

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

4 个答案:

答案 0 :(得分:23)

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

  

字节顺序标记(或BOM)是一个   特别标记添加在非常   编码的Unicode文件的开头   采用UTF-8,UTF-16或UTF-32。它被使用了   指示文件是否使用   big-endian或little-endian字节   订购。 BOM对于UTF-16是强制性的   和UTF-32,但它是可选的   UTF-8。

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

检查此问题的以下答案:Java:How to determine the correct charset encoding of a stream如果您现在想要自行确定BOM(风险自负),请检查此代码Java Tip: How to read a file and automatically specify the correct encoding

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

答案 1 :(得分:17)

字节顺序标记可能是这些字节序列之一:

     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;表示),因此不一定要避免数据丢失。

答案 2 :(得分:4)

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

答案 3 :(得分:3)

OP:

  

有人能告诉我一种可以检测BOM的Java方法吗?

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

  

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