什么是 XML BOM,如何检测它?

新手上路,请多包涵

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

原文由 djangofan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 717
2 个回答

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

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

_(来源: https ://www.opentag.com/xfaq_enc.htm#encbom)

关于如何在 java 中检测到这一点的问题。

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

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

原文由 jitter 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

      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 字符文字(Java 字符值 隐式 为 UTF-16)。由于 U+FEFF 不在大多数编码中,因此此 BOM 代码点不可能由它们编码。 ( 更多关于在此处使用 Java 编码 BOM 的信息。)

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

我提倡尽可能使用 Unicode 编码(另请参阅 Unicode 的 10 条诫命)。也就是说,XML 允许通过转义实体表示任何 Unicode 字符(例如,“A”可以表示为 &#x0041; ),因此它不一定是避免数据丢失的必要条件。

原文由 McDowell 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题