XML头中的'encoding'有什么用?

xto*_*ofl 42 xml header character-encoding

查看XML标头

<?xml version="1.0" encoding="UTF-16" standalone="no"?>
Run Code Online (Sandbox Code Playgroud)

我是否正确地声明encoding属性是

  • 来得太晚了(除非你知道编码,否则你无法正确阅读...)
  • 冗余,因此容易出错:用"Big5"替换它很容易,但用UTF-8保存文件

或者该属性不是关于流的内容

我在这里混淆了什么吗?

Joa*_*uer 41

如您所述,您必须知道文件的编码才能读取encoding属性.

但是,有一种启发式方法可以让您足够接近"真实"编码,以便您阅读编码属性.这是有效的,因为<?xml按定义的部分只能包含ASCII范围内的字符(但它们是编码的).

XML标准甚至描述了用于找出编码的确切过程.

编码标签也不冗余.例如,如果您使用XML规范中的算法来查找使用某些基于ASCII(或ASCII兼容)的编码,您仍然需要读取编码以找出实际使用的编码(有效候选将是ASCII ,UTF-8,任何ISO-8859-*编码,任何Windows-*编码,KOI8-R以及许多其他编码器.对于<?xml零件本身而言,它不会产生任何差别,但对于文档的其余部分,它可以产生巨大的差异.

关于误标记的XML文件:是的,这很容易产生的,但是:XML规范明确规定,这些文件是恶意形成的,因此是不正确的XML.必须将不正确的编码报告为错误(只要可以检测到它们!).所以这就是生成XML的人的问题.


Mic*_*Kay 6

你说它看起来像一个奇怪的设计是对的.它只能起作用,因为XML声明只使用ASCII字符,几乎所有编码都是ASCII的超集.如果你准备接受不是的东西,例如EBCDIC,你可以检查文件是否以EBCDIC表示的任何内容开头"<?xml".这意味着您依赖于文件头中的一般冗余级别,而不是纯粹的编码属性本身.像XML中的许多东西一样,它实用且有效,但并不是特别优雅.

  • EBCDIC"4C 6F A7 94 93"中的"<?xml".然而,并非所有EBCDIC代码页都以相同的方式编码:代码页1026使用`FC`而大多数其他代码页使用`7F`,因此您必须同时查找两者. (2认同)