在xml/html上使用启发式方法进行编码识别?
假设我有一个存储在远程计算机上的XML文件。我不知道这个文件是怎么保存的。(使用了什么编码) 我想读取此文件并对该XML文件执行一些操作 但后来我想:,好吧,如果我不知道如何分析硬盘上的字节,在xml/html上使用启发式方法进行编码识别?,html,.net,xml,parsing,encoding,Html,.net,Xml,Parsing,Encoding,假设我有一个存储在远程计算机上的XML文件。我不知道这个文件是怎么保存的。(使用了什么编码) 我想读取此文件并对该XML文件执行一些操作 但后来我想:,好吧,如果我不知道如何分析硬盘上的字节,我怎么才能读懂编码部分呢 经过一小段时间后,我被告知可以在UTF-8和UTF-16之间自动推断编码,而这些是XML规范规定的唯一可以忽略的 这让我问:其他编码呢?如果XML保存在编码lala的中,我怎么知道它呢 当Jon引用我的w3c文章时,我确实发现: XML编码声明的功能是在每个 实体,指示正在使用的字
我怎么才能读懂编码部分呢
经过一小段时间后,我被告知可以在UTF-8和UTF-16之间自动推断编码,而这些是XML规范规定的唯一可以忽略的
这让我问:其他编码呢?如果XML保存在编码lala的中,我怎么知道它呢
当Jon引用我的w3c文章时,我确实发现:
XML编码声明的功能是在每个
实体,指示正在使用的字符编码在XML之前
处理器可以读取内部标签,但显然必须读取
知道使用的是什么字符编码,这是内部
标签试图指示
它通过以下方式实现:
因为每个XML实体都没有外部编码
非UTF-8或UTF-16编码的信息必须以XML开头
编码声明,其中第一个字符必须是,这是必需的,因为启发式方法不能总是完全确定编码是什么。例如,对于不带字节顺序标记的序列,该序列的编码为:003c 003f
UTF-16BE或big-endian ISO-10646-UCS-2或其他编码,16位代码单元采用大端顺序,ASCII字符编码为ASCII值(必须读取编码声明以确定哪种编码)
(重点加上。)
实际上,在没有字节顺序标记的情况下,似乎在所有情况下(除了caseOther
)都必须读取编码声明。它只是没有在规范的文本中变得非常突出
在启发式不足以完全确定的情况下,解析器调整其解码足以读取编码声明并最终确定编码。(规范实际上也这么说。)读取XML文件需要两种编码(我不会提及BOM,它只是简化事情的另一个提示):
1) 第一种编码用于读取XML声明。它更像是面向字节的编码,因为您只需要读取US-ASCII字符。你有一堆字节,你需要读一堆ASCII字符
注意,这是因为编码名称只能包含US-ASCII字符()。例如,在那个阶段,您实际上不需要区分UTF-8和US-ASCII,因为它们以相同的方式编码ASCII字符
因此,这里要测试的编码数量是有限的,因为您关注的是字节->ASCII(1字节->1字符,2字节->1字符,4字节->1字符等)字符转换,而不是整个Unicode集合。您将在此处使用的编码可能不会用于文件的其余部分
例如,此时,您将无法区分使用该编码的文件和使用ISO-8859-1编码的文件。为此,您需要读取编码名称
2) 第二种编码用于读取文件的其余部分。@Tomalak和那些ascii字符,它们保存在哪种编码中?看这张桌子。(也请阅读我与Jon的讨论)。我现在理解了你的问题,忘了我的评论。我在2分钟前问了一个评论,我将再次粘贴到这里(:-)---仍然是一个小问题:我是解析器。我已经读了前3个字节。我在做试探,直到我到达你可以有一个与文件的第一个字节不一致的编码名称(例如,如果第一个字节每字符编码一个字节,编码是UTF-16)。在本例中,XML文件不正确。此密钥的权限有限,只有在您愿意的情况下才适合读取编码名称。