nutch-乱码解决

在Nutch的搜索框中输入中文,点击“搜索”按钮之后,可以看到搜索框中的关键字是乱码,搜索结果也为空。网上有很多文章都谈到了这个现象,这不是Nutch的问题,而是Tomcat没有对uri做编码造成的。解决的办法也很简单,在Tomcat的安装目录下找到”conf/server.xml”文件,在"Connector port=”8080″ ”那一节添加URIEncoding="UTF-8" useBodyEncodingForURI="true"可以了。完整的配置可能是下面这个样子:

<Connector port="8080" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443"

URIEncoding="UTF-8"

useBodyEncodingForURI="true"/>

修改这个文件时要特别注意,把代码复制过去后,因为字符集的问题,可能要把空格和"重新输入,否则会造成tomcat无法启动

解决方法: 修改cached.jsp


+++ cached.jsp.patched 2009-02-18 12:43:26.000000000 -0500
@@ -40,6 +40,7 @@
.getLocale().getLanguage();

Metadata metaData = bean.getParseData(details).getContentMeta();
+ Metadata parseMetaData = bean.getParseData(details).getParseMeta();

String content = null;
String contentType = (String) metaData.get(Metadata.CONTENT_TYPE);
@@ -49,7 +50,7 @@
// but I don't know how to emit 'byte sequence' in JSP.
// out.getOutputStream().write(bean.getContent(details)) may work,
// but I'm not sure.
- String encoding = (String) metaData.get("CharEncodingForConversion");
+ String encoding = (String) parseMetaData.get("CharEncodingForConversion");
if (encoding != null) {
try {
content = new String(bean.getContent(details), encoding);

 

Debug过程:

在Tomcat下查看Nutch抓取的页面的缓存时,发现非英语系的页面缓存显示为乱码,例如中文gb2312编码的网页

1. 首先先想dump一下segment看看是否保存了正确的raw data。

在CentOS 5.2下dump segment (bin/nutch readseg -dump crawl/segments/2009* outputdir)的时候,发现如果是缺省的locale(en_US.UTF-8),则dump的结果Content域显示乱码;如果locale是zh_CN,则dump的结果Content域显示正常,这说明segment保存了正确的raw data。

2. 查看某dump的结果片断


Parse Metadata: CharEncodingForConversion=GB2312 OriginalCharEncoding=GB2312

发现CharEncodingForConversion=GB2312 OriginalCharEncoding=GB2312都已正确设置

3. 查看cached.jsp的源代码

Metadata metaData = bean.getParseData(details).getContentMeta();

String content = null;
String contentType = (String) metaData.get(Metadata.CONTENT_TYPE);
if (contentType.startsWith("text/html")) {
// FIXME : it's better to emit the original 'byte' sequence
// with 'charset' set to the value of 'CharEncoding',
// but I don't know how to emit 'byte sequence' in JSP.
// out.getOutputStream().write(bean.getContent(details)) may work,
// but I'm not sure.
String encoding = (String) metaData.get("CharEncodingForConversion");
if (encoding != null) {
try {
content = new String(bean.getContent(details), encoding);
}
catch (UnsupportedEncodingException e) {
// fallback to windows-1252
content = new String(bean.getContent(details), "windows-1252");
}
}
else
content = new String(bean.getContent(details));
}发现其去Content Metadata中找”CharEncodingForConversion”,显然找不到,于是作了最上面(解决办法之中)的修改,使之去Parse Metadata中读取”CharEncodingForConversion”,然后解码,这时候发现缓存页面显示正确了,乱码消失了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值