【问题标题】:How to read the encoding header without knowing the encoding?如何在不知道编码的情况下读取编码头?
【发布时间】:2009-10-20 15:18:26
【问题描述】:

如果我正在读取 HTML 文件的 XML,我是否必须读取告诉我能够读取文件的编码的标签?该标签的编码方式与文件的编码方式不同吗?我很好奇你是如何在不知道编码的情况下阅读该标签的。我意识到这是已解决的问题。我只是好奇它是怎么做到的。

更新 1

我不明白,在 UTF-16 中,每个字符不会占用 2 个字节,而不是一个,并且与 ascii 不同吗?例如,UTF-16 (U+0045) 中的字符 E 是 0xfeff0045。那是 0xfeff 然后是 0x0045,但是一些编码会改变它的字节序。您是否必须通过检查 0xfeff 并意识到它不能是 ASCII 或其他东西来弄清楚?

【问题讨论】:

    标签: html xml character-encoding


    【解决方案1】:

    以下是 W3C 对此的评价:

    XML 编码声明函数 作为每个实体的内部标签, 指示哪个字符编码是 正在使用。在 XML 处理器可以之前 阅读内部标签,但是,它 显然必须知道什么字符 编码正在使用中——这就是 内部标签试图表明。 在一般情况下,这是一个 无望的情况。这并不完全 然而,在 XML 中毫无希望,因为 XML 以两种方式限制一般情况: 假设每个实现 仅支持有限的字符集 编码和 XML 编码 声明位置受限 和内容,以使它 可以自动检测字符 在每个实体中使用的编码 正常情况。

    http://www.w3.org/TR/2000/REC-xml-20001006#sec-guessing

    【讨论】:

    • +1 换句话说,处理器只是尝试所有编码,直到 XML 编码声明出现在输出中
    【解决方案2】:

    编码名称仅限于 ([A-Za-z0-9._] |'-'),因此对于任何基于 ASCII 或 ISO-646 的编码(例如 ISO 8859-*、ISO 10646/ Unicode)。

    编辑:尽管如此,仍有一些歧义。例如,您仍然需要了解是否尝试一次读取 8 位、16 位或 32 位块来读取它。还有一个小细节,要成为一个正确的 UTF-16 或 UTF-32/UCS-4 文件,它应该以 BOM 开头——但 XML 规范似乎不允许包含 BOM ......

    但是,如果您知道该文件应该包含 XML,那么您就非常了解该文件需要如何开始,因此很容易检测到错误的猜测。

    【讨论】:

    【解决方案3】:

    对于 HTML,它记录在 HTML5 中。 (不过,如果您仍然相信网络上的任何事情都是正常的,请不要阅读。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-02
      • 1970-01-01
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 2011-05-16
      相关资源
      最近更新 更多