Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在xml/html上使用启发式方法进行编码识别?_Html_.net_Xml_Parsing_Encoding - Fatal编程技术网

在xml/html上使用启发式方法进行编码识别?

在xml/html上使用启发式方法进行编码识别?,html,.net,xml,parsing,encoding,Html,.net,Xml,Parsing,Encoding,假设我有一个存储在远程计算机上的XML文件。我不知道这个文件是怎么保存的。(使用了什么编码) 我想读取此文件并对该XML文件执行一些操作 但后来我想:,好吧,如果我不知道如何分析硬盘上的字节,我怎么才能读懂编码部分呢 经过一小段时间后,我被告知可以在UTF-8和UTF-16之间自动推断编码,而这些是XML规范规定的唯一可以忽略的 这让我问:其他编码呢?如果XML保存在编码lala的中,我怎么知道它呢 当Jon引用我的w3c文章时,我确实发现: XML编码声明的功能是在每个 实体,指示正在使用的字

假设我有一个存储在远程计算机上的XML文件。我不知道这个文件是怎么保存的。(使用了什么编码)

我想读取此文件并对该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值(必须读取编码声明以确定哪种编码)

(重点加上。)

实际上,在没有字节顺序标记的情况下,似乎在所有情况下(除了case
Other
)都必须读取编码声明。它只是没有在规范的文本中变得非常突出


在启发式不足以完全确定的情况下,解析器调整其解码足以读取编码声明并最终确定编码。(规范实际上也这么说。)

读取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文件不正确。此密钥的权限有限,只有在您愿意的情况下才适合读取编码名称。