webharvest 配置文档出现乱码的解决方法

 

只要把ScraperConfiguration源码的输入源由inputSource改成inputStream,那么SAX 解析器将会自动检测编码。
public class InputSource
extends Object

XML 实体的单一输入源。

此模块(包括源代码和文档)在公共域中,同时 没有担保有关更多信息,请参阅 http://www.saxproject.org

此类允许 SAX 应用程序封装有关单个对象中的输入源的信息,它可包括公共标识符、系统标识符、字节流(可能带有指定的编码)、基本 URI 和/ 或字符流。

在以下两种情况下应用程序可以将输入源提供给解析器:作为 Parser.parse 方法的参数,或者作为 EntityResolver.resolveEntity 方法的返回值。

SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入。如果有字符流可用,则解析器将直接读取该流,而忽略该流中找到的任何文本编码声明。如果没有字符流,但却有字节流,则解析器将使用该字节流,从而使 用在 InputSource 中指定的编码,或者另外(如果未指定编码)通过使用某种诸如 XML 规范 中的算法算法自动探测字符编码。如果既没有字符流,又没有字节流可用,则解析器将尝试打开到由系统标识符标识的资源的 URI 连接。

InputSource 对象属于该应用程序:SAX 解析器将不会以任何方式修改它(它可以在必要时修改副本)。但是,作为解析终止清除的一部分,对字节流和字符流的标准处理就是关闭这二者,因此在将此类流传递给解析器后应用程序不应尝试重新使用它们。


改进 InputSource 构造

InputSource inputSource = new InputSource(myInputStream);
inputSource.setSystemId("http://www.oreilly.com");
inputSource.setEncoding("UTF-8");


使用了 setEncoding() 方法来通知 SAX 解析器使用何种编码;在涉及国际化或使用多字节字符集的 XML 应用程序中,这一点很重要。

但是,这里产生了另一个问题:对于字符编码,用手工设置字符编码的编码与所提供的输入流(通过 java.io.InputStream 或 java.io.Reader )所用的编码 不同 ,这种情况很常见。如果这些编码不匹配,就可能发生各种解析问题。要避免这种情况,请始终用 Java InputStream 创建您的 InputSource ,而不要用 Reader 或 String 系统标识(这些都是 JAXP API 的可能选项)。当您提供 InputStream 时,SAX 实现将流封装在 InputStreamReader 中;然后 SAX 自动从流中检测正确的字符编码。随后,您可以省略 setEncoding() 步骤,再次减少方法调用。结果是应用程序运行更快了,并且字符编码始终正确。 使用 InputStream 向 SAX API 输入 XML 比将 Reader 用作输入明显更有效且更安全

 

转自:http://hi.baidu.com/yuweiming/blog/item/306a9e3df9e16e0fbaa1679d.html

更新:

 

package org.webharvest.definition;
public class ScraperConfiguration {...
public ScraperConfiguration(File sourceFile) throws FileNotFoundException {
        this.sourceFile = sourceFile;
//      InputSource inputSource = new InputSource(new FileReader(sourceFile));
        InputSource inputSource = new InputSource(new FileInputStream(sourceFile));
        inputSource.setEncoding("UTF-8"); 
        createFromInputStream( inputSource );
    }
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值