Java 什么html解析器能够处理编码?

Java 什么html解析器能够处理编码?,java,html,encoding,html-parsing,Java,Html,Encoding,Html Parsing,这是开始--我在磁盘上有一个文件,它是HTML页面。当我用普通的网络浏览器打开它时,它会按应有的方式显示——也就是说,无论使用何种编码,我都能看到正确的国家字符 然后我来了——我的任务是加载同一个文件,解析它,并在屏幕(控制台)上打印出一些片段——比如说,所有文本。当然,我只想看到正确的字符,而不是一些曼波巨无霸。最后一步是更改一些文本,并保存文件 因此,解析器必须同时以两种方式解析和处理编码。到目前为止,我还不知道解析器甚至能够正确加载数据 问题: 你推荐什么解析器 细节 HTML页面通常在标

这是开始--我在磁盘上有一个文件,它是HTML页面。当我用普通的网络浏览器打开它时,它会按应有的方式显示——也就是说,无论使用何种编码,我都能看到正确的国家字符

然后我来了——我的任务是加载同一个文件,解析它,并在屏幕(控制台)上打印出一些片段——比如说,所有文本。当然,我只想看到正确的字符,而不是一些曼波巨无霸。最后一步是更改一些文本,并保存文件

因此,解析器必须同时以两种方式解析和处理编码。到目前为止,我还不知道解析器甚至能够正确加载数据

问题: 你推荐什么解析器

细节 HTML页面通常在标题(meta标记)中给出了编码,所以解析器应该使用它。这种情况下,我必须提前查看并检查编码,然后在代码中手动设置编码是不可行的。例如,这摘自JSoup教程:

File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");
我不能这样做,解析器必须自己处理编码检测


在C#中,我在加载html时遇到了类似的问题。我使用HTMLAgilityPack并首先执行编码检测,然后使用它对数据流进行编码,然后解析数据。所以,我明确地执行了这两个步骤,但是由于库提供了这两种方法,所以我觉得这很好


这种显式分离可能更好,因为在缺少报头的情况下可以使用概率编码检测方法。

对于该解析方法,Jsoup API参考说明,如果提供
null
作为第二个参数(编码参数),它将使用
httpequiv
meta标记来确定编码。因此,它看起来已经执行了“解析位、确定编码、使用正确编码重新解析”例程。通常,这样的解析器应该能够使用任何可用的方法来解析编码本身。我知道Java中的SAX解析器应该使用字节顺序标记和XML声明来尝试建立编码

显然,如果找不到合适的元标记,Jsoup将默认为UTF-8。正如他们在文档中所说的那样,这是“通常安全的”,因为UTF-8与许多用于较低代码点的通用编码兼容。但我认为“通常安全”在这种情况下可能还不够好

如果您不完全信任Jsoup来检测编码,我会看到两种选择:

  • 如果您以某种方式确定HTML实际上始终是XHTML,那么XML解析器可能更适合。但只有在输入完全符合XML的情况下,这才有效
  • 通过尝试使用字节顺序标记、使用通用编码解析部分并查找元标记、按头标记中预期的字节模式检测编码,最后,如果所有其他操作都失败,则使用默认值,自己执行启发式编码检测

不,不,这不是信任的问题,我只是看到硬编码的UTF8被关闭了。我马上会查的,非常感谢!我已经尝试过TagSoup+scala.XML,但是我没有看到任何编码检测的地方,默认设置被破坏(例如,国家字符显示不正确)。更新:我测试过,效果很好。再一次谢谢你。