如果我实现UTF-16文件处理程序,它可以准确处理所有其他编码

如果我实现UTF-16文件处理程序,它可以准确处理所有其他编码

问题描述:

我正在编写一个小型的HTML爬虫在Java中。我想要一个单独的文件处理程序,它可以逐个打开所有的HTML文件并处理它们。但是,在实际打开特定文件之前,无法知道HTML文件的编码方式。所以,我愿意知道如果我能有这样的事情:如果我实现UTF-16文件处理程序,它可以准确处理所有其他编码

new BufferedReader(
    new InputStreamReader(
     new FileInputStream(file), UTF16)); 

和处理程序将能够读取所有可能的编码(以精确的方式),该文件可能(我的想法是UTF16落后与所有其他编码兼容)。我将不得不处理以下编码。

charset=iso-8859-1 
charset=utf-8 
charset=iso-8859-1 
charset=iso-8859-15' 
charset="UTF-8" 
charset=windows-1252 
charset=utf-16 

谢谢。任何建议将不胜感激。

+0

出于好奇,你打算用什么样的设计模式来完成这项任务? – 2010-12-06 17:36:27

没有UTF16只能理解以UTF16编码的文件。在处理文件之前,最好的办法就是确定编码。使用GuessEncoding库来检测编码,然后在检测到的编码中构造阅读器。

我会结合乔恩斯基特的建议

不,UTF-16肯定是而不是兼容所有其他编码(因为您不能使用UTF-16解码器来解码任何旧文本)。尝试将它用于UTF-8,ISO-Latin-1或其他任何编码,并且会失败。

假设这个HTML已从Web服务器获取,您应该记住响应中给出的内容类型。当然,你也可以试探性地猜测编码。

+0

我想知道contentType是否会在所有情况下工作。这仅仅和服务于内容的服务器端代码一样好 – 2010-12-06 17:40:51

+0

@Pangea:是的,如果服务器在于它而且你无法从内容本身猜测,那么你就会陷入困境。最终会出现这样的情况,即文本可能是有效的,但在两种不同的编码方式中是不同的 - 如果您没有提示,则绝对无法知道应该如何解释它。 – 2010-12-06 17:42:05

+0

谢谢,朋友。由于这个世界有点混乱,我正在将你的建议与Joshua algo结合起来。即先读取一些字符,然后依靠内容类型。 – bikashg 2010-12-06 21:14:50

哇使用。哇哇!

要做到这一点,唯一的方法是用Windows-1252等安全编码读取前几百个字节,然后查找指示UTF-16/32和META字符集标记的NULLS。

失败的是,查看字符集的标题。

如果找不到头文件,除非解析出来,否则假定为UTF-8(标准),然后假定Windows-1252(常见错误是发送没有字符集头文件的Windows-1252)。