gpt4 book ai didi

java - XML 编码声明和字节顺序

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:29:02 24 4
gpt4 key购买 nike

我正在整理我的一些非常旧的 Java 代码,这些代码是在 XML 解析包含在 JDK 库中之前编写的 XML 规范的第一版,并试图更新它并编写一些测试。特别是我正在(重新)实现 XML character encoding autodetection像这样:

  1. 我阅读了 BOM(如果有的话)。
  2. 如果没有 BOM,我会根据预期的 <?xml“推算”一个 BOM XML 声明的开始。
  3. 我现在有足够的信息(每个字符的字节数、字节顺序等)来阅读 encoding=声明,如果有的话,根据 XML 规范可能会告诉我一些更具体或深奥的编码

假设该文件具有 UTF-16LE 的实际 BOM。 XML 的值应该是多少 encoding属性?应该是encoding="UTF-16LE" ?但是 Unicode Byte Order Mark FAQ似乎表明,如果存在 UTF-16 系列 BOM,我应该将文本“标记为”仅仅是 UTF-16 .这是否意味着我应该使用 encoding="UTF-16"在我的 XML 文件中?但是我的解析器是否应该忽略 encoding值并使用它从 BOM 确定的更具体的字符集?我开始迷惑自己了。

W3C HTML BOM FAQ似乎表明标记文本是指“在 HTTP 中标记”,即外部字符集指定,大概在 HTTP Content-Encoding 中 header 。因此,拥有一个以 BOM 开头但包含 UTF-16LE 的 XML 声明的 XML 文件可能没问题。或 UTF-16BE .但是我还没有看到这样的 XML 文件。

如果我将 UTF-16LE BOM 与 XML 文件一起使用,1) 我应该在 encoding 中使用什么值属性,以及 2) 我的解析器应该自动检测什么字符集作为文件的编码?

最佳答案

理解这一点的关键是要认识到 UTF-16 编码方案不同于 UTF-16LE 和 UTF-16BE。 UTF-16,little endian,不是 UTF-16LE。

请特别注意 Unicode BOM FAQ 中最后一个问题中的第 4 点。如果编码是 UTF-16BE 或 UTF-16LE,则不得使用 BOM。这些“编码方案”的正式定义也可以引用Unicode标准中的3.10。

因此,如果您找到 UTF-16 的 BOM,则编码是 UTF-16,而不是 UTF-16LE 或 UTF-16BE(两者都不允许有 BOM)。如果没有 BOM,则编码可能是这三种编码中的任何一种,但在这种情况下,UTF-16 基本上无法与 BE 和 LE 变体区分开来。但是,请注意 XML 1.1 的 4.3.3 说“以 UTF-16 编码的实体必须以 UTF-8 编码的实体可以以字节顺序标记开头”。所以在XML的情况下,如果没有BOM,那么编码就不能是UTF-16(但有可能是UTF-16BE或UTF-16LE)。

关于java - XML 编码声明和字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25477854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com