【问题标题】:BOM vs explicit encoding declaration in XMLBOM 与 XML 中的显式编码声明
【发布时间】:2014-11-15 01:09:23
【问题描述】:

只是想知道为什么 XML 使用显式编码声明。对我来说,它看起来像一个奇怪的设计。 考虑一个 UTF-16 编码声明(参见示例)。流/文件开头的 BOM 不会使其过时吗?如果 BOM 指示 UTF-16 并且显式编码声明设置为 UTF-8,会发生什么情况?这有什么意义吗?

<?xml version="1.0" encoding="utf-16" ?>

【问题讨论】:

  • 请注意,省略 XML 声明的编码声明部分是完全合法的(我猜这通常是明智的)。在这种情况下,它看起来就像 &lt;?xml version="1.0"?&gt;。在许多情况下,编码已经从其他来源获知,或者可以自动正确推断。

标签: xml encoding utf-8 character-encoding utf-16


【解决方案1】:

在 StackOverflow 上报告了大量由于读取错误编码的数据而导致的问题。可悲的是,当您从文件存储中读取文件或通过某种协议(例如 HTTP)获取消息时,通常没有可用的编码信息,而且当有编码信息时,它通常是不可靠的。将编码放在文件头中只是解决此问题的一种实用且不完美的尝试(BOM 是另一个)。这不是全部答案(因为例如文件传输操作等不支持 XML 的进程很容易在不更改 XML 声明的情况下更改编码),但它会有所帮助。

【讨论】:

    【解决方案2】:

    您如何区分 ISO-8859-1 编码的文档和 ISO-8859-2 编码的文档?根本没有 BOM,如果没有 XML 声明说明使用了哪种编码,您就无法推断编码。如果 XML 只允许 UTF-8 和 UTF-16,那么基于 BOM 的检测可能就足够了,尽管我认为我记得 Java 世界中的早期 XML 解析器受到 UTF-8 BOM 的挑战。 所以基本上,为了支持大量的编码,需要 XML 声明来声明使用的编码。

    【讨论】:

    • 但是,正如我在上面也评论过的,XML 声明省略编码声明部分也是合法的:&lt;?xml version="1.0"?&gt;
    猜你喜欢
    • 2011-11-25
    • 2016-11-06
    • 2014-10-18
    • 1970-01-01
    • 2020-02-14
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    相关资源
    最近更新 更多