2009-10-20 70 views
4

如果我正在阅读HTML文件的XML,那么我是否必须阅读标记以告诉我可以读取文件的编码?该标签是不是以与文件相同的方式进行编码?我很好奇你如何阅读该标签而不知道编码。我意识到这是解决问题。我只是好奇它是如何完成的。如何在不知道编码的情况下读取编码头?

更新1

我不明白,在UTF-16不会每个字符占用2个字节,而不是一个,而且比ASCII不同?例如,UTF-16(U + 0045)中的字符E是0xfeff0045。那是0xfeff,然后是0x0045,但是一些编码会改变那个末端。你是否必须通过检查0xfeff并意识到不能是ASCII或什么?

回答

6

这里是W3C不得不说一下吧:

的XML编码声明 在实体中以内部标签, 指示哪些字符编码是使用 。然而,在一个XML处理器可以读取内部标签之前, 显然必须知道哪些字符 正在使用 - 哪些是 内部标签试图指示的内容。 在一般情况下,这是一个无望的情况。这不是在XML完全 无望,但是,因为XML 以两种方式限制了一般的情况: 每个实现被假定为 仅支持有限的一组字符 编码,并且所述XML编码 声明在 位置限制和内容,以便使其 可行,以自动检测 编码中正在使用的每个实体中的 正常情况。

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

+0

+1换句话说,处理器只是尝试所有的编码,直到XML编码声明出现在输出中 – 2009-10-20 16:05:30

1

编码名称仅限于([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,那么您可以很好地了解文件需要的启动方式,因此不正确的猜测很容易检测到。

+0

我不明白,在UTF-16中不会每个字符占用2个字节,而不是一个,并且与ascii不同? – 2009-10-20 15:28:17

+2

解析器在没有BOM的情况下推导出UTF编码的长度有严格的规则:http://www.w3.org/TR/2000/REC-xml-20001006#sec -guessing-no-ext- info – 2009-10-20 15:39:46

0

对于HTML,它HTML5被记录在案。 (不要阅读,如果你仍然相信网络上的任何东西都很理智)

相关问题