【问题标题】:XML declaration encodingXML 声明编码
【发布时间】:2011-11-25 10:13:06
【问题描述】:

它实际上是做什么的?在我非常基本的理解水平上,XML 只是一个格式化的文本。所以不涉及二进制文本转换。

我高度怀疑 UTF-8 和 ASCII 编码之间的唯一区别是 ASCII 编码通过将所有非 ASCII 字符转换为 XML 实体而不是仅保留 XML 字符,从而使 XML 编写器更加工作。所以 ASCII 编码的 XML 仍然可以包含 UTF-8 字符,只是它会更长更丑。

或者还有其他的功能吗?

更新:

我完全理解单个字符如何通过编码转换为字节。然而,XML 只是文本标记,绝不会这样做。

问题真的是为什么XML编码值存储在XML中?或者在什么情况下 XML 阅读器需要知道任何特定 XML 文档使用了哪种编码?

【问题讨论】:

  • 没有“UTF-8 字符”之类的东西。您可能是指非 ASCII Unicode 字符。声明的原因是有很多不同的编码,比如 windows-1250 或 latin-2。 UTF-8 和 ASCII 不是仅有的两个选项。
  • 好的,但是为什么 XML 声明首先需要编码?
  • 因为当你想读取文件,例如显示给用户时,你需要知道如何将字节解码为字符。

标签: xml


【解决方案1】:

是的,XML 文件是一个文本文件,即一个字符序列。文件是bytes 的序列。那么单个字符是如何编码的,即转换成字节序列呢?有几种方法可以将字符编码为字节; “编码”声明表明使用哪一个。

因此,“编码”声明起着非常重要的作用:一个绝对需要知道使用哪种编码能够仅仅从文件中读取字符。如果未指定编码,则 XML 具有一组默认编码,具体取决于“字节顺序标记”(BOM)的存在。如果没有 BOM,则默认编码为 UTF-8。

ASCII 是最简单的编码形式之一。它只能表示 128 个基本拉丁字符的跨度。 UTF-8 更精细;它可以代表所有Unicode 字符集。所以你是对的,如果你使用 ASCII,你必须使用 XML 实体来表示存在于 Unicode 中但不存在于 ASCII 中的大量字符。

【讨论】:

  • 我还是一头雾水。 XML 声明与文件有什么关系?或者任何存储方式,包括内存? XML 只是文本。包含 XML 的字符串如何编码以写入文件似乎与其内容完全无关。
  • 您说“XML 只是文本”,这完全正确。但是要将文本的任何部分存储在计算机中,您必须将每个字符映射到 code(实际上是一个字节序列)。这种映射称为编码。所以 any 文本文件是根据编码写入的。要读取文件,您需要知道用于写入的编码。
  • 您混淆了两种不同级别的编码。 XML 编码不会将字符转换为字节,而是将字符转换为字符或 XML 实体。
  • 没有。 <?xml encoding... ?> 声明与实体没有直接关系。它们之间的唯一关系是间接:如果您选择的编码无法表示某些 Unicode 码位,那么要使用这些编码,您有义务使用相应的实体。
  • 这不正是我在开场白中所说的吗?
【解决方案2】:

我强烈推荐阅读The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)。您说 XML 是“只是文本”,好像这使一切变得简单,但即使知道它是文本而不是某些结构化的二进制格式,也不意味着您确切知道如何阅读它或其中包含哪些字符。

这不是“去阅读手册!”回答,我相信建立这个关于文本有多难的基线将有助于解释为什么存在 XML 声明。

为什么 XML 声明首先需要编码?

这是本文中提到的想法之一,但在此值得强调:所有文本都有编码。没有“纯文本”这样的东西。 ASCII 一种编码,即使我们大部分时间都不会考虑它。从历史上看,我们经常陷入困境并假设一切都是ASCII,但这在当今时代是不可行的。 XML 声明的编码帮助了我们,哪里有一个 .txt 文件没有说明它的编码是什么。

【讨论】:

  • 我仍然看不出这与 XML 有什么关系。从 XML POV 字符只是一个字符。它有 1 个字节 2 还是 3?这取决于底层框架来决定。如果我将我的 XML 声明为 是否意味着它不能包含 Unicode 字符?当然可以,它们只是将被转换为 XML 实体。事实上,我不认为读取 XML 的程序需要注意声明编码值。它对于 XML 编写器来说绝对是重要的,但是为什么要存储它呢?我猜只是为了记账?
  • 从定义标签和属性等的角度来看,它不关心字符编码是正确的。通常,XML 库将专门使用 UTF-8 在程序端工作 - 当您为其提供数据以创建文档或获取数据时,它必须是 UTF-8。编码与 XML 序列化一起使用,这也是规范的一部分。 XML 规范的存在与将数据转换为字节流的想法完全分开,它也有这样做的规则。例如,所有 XML 解析器必须支持 UTF-8。
  • 如果指的是 XML 文档的 abstract 模型,您所说的是正确的。但实际上,XML 文档必须存储在某个地方,内存或文件中。所以你需要为字符串编码选择一个约定。 XML 声明指定将 XML 文档序列化为文本文件时使用哪种编码。
  • @Jason 我已经更新了我的问题,因为很多人似乎对此感到困惑。
  • @ChrisJ 不正确。我可以轻松编写使用 ASCII XML 编码的代码,但将其以 UTF-8 格式写入文件。
【解决方案3】:

请参阅 XML 规范中的附录 F,“Autodetection of Character Encodings”。

特别是,“XML 编码值存储在 XML 中”,因为默认情况下,XML 处理器必须假定内容为 UTF-16 或 UTF-8,在 XML 文档之外找不到外部元数据的情况下。 XML 声明专为此类元数据不存在的情况而设计。

XML 处理编码的另一个优点是,通过这种方式,XML 处理器 只需要支持两种编码,即 UTF-8 和 UTF-16。如果处理器发现, 在外部元数据或 XML 声明中,文档处于编码状态 它不支持,它可能会比它继续阅读文档(长 在声明之后)并遇到一个意外的编码字节序列 使用依赖于实现的启发式检测。

【讨论】:

  • owww... 这实际上有点吓人。所以读取文件时(字节流) XML 编码可以作为一个提示来确定文件编码。在实现方面似乎非常神奇。虽然我认为,由于文件编码必须支持不小于用于 XML 编码的字符集,所以这是一个有效的假设。
  • 它没有其他选择那么神奇。如果我们从磁盘读取逗号分隔的 .txt,则绝对没有标准方法可以明确知道编码是什么,它必须是特定于应用程序的。使用 XML,我可以为您提供一个 UTF-8 文档、一个 ISO-8859-1 文档和一个 UTF-16 文档,并且通过正确的 xml 声明,我可以 100% 确定您正确实施的 xml api 将没有难以阅读。
  • @PeterO。如果文件通过 http 使用 Content-Type: text/xml; 发送怎么办? charset=ISO-8859-1 但 xml 文档本身声称它是 utf-8 ?
  • @Pacerier:在这种情况下,HTTP 标头的内容类型声明优先于文档本身中的任何字符编码声明。因此,文档可能会被误解。有关更多信息,请参阅Authoritative Metadata:“在封装容器中接收的元数据 [例如 HTTP 标头] 必须被认为是权威的,并且优先使用通过检查数据发现的元数据 [例如文档的自我声明的编码]。”
猜你喜欢
  • 2016-11-06
  • 2014-10-18
  • 2014-11-15
  • 2021-06-12
  • 2015-02-01
  • 2016-11-08
  • 2020-02-14
  • 2018-03-01
  • 1970-01-01
相关资源
最近更新 更多