在使用.NET下的NCrawler爬取网页信息时,如果网页以GBK或GB2312进行编码,则下载的内容会出现乱码。
查找原因,发现在NCrawler.HtmlProcessor项目下HtmlDocumentProcessor.cs中的Process()方法使用htmlDoc.DetectEncoding(reader)进行页面编码检测,出现中文乱码情况。
改用HttpWebResponse中返回的CharacterSet进行编码判断,发现部分网页的Header中未定义CharacterSet,会出现乱码。调试发现这类网页的HttpWebResponse中返回的CharacterSet被统一设置为ISO-8859-1。查阅MSDN发现CharacterSet的缺省设置为ISO-8859-1。
修改Process(),使用以下方法可以有效解决乱码问题:
Encoding documentEncoding = Encoding.GetEncoding(propertyBag.CharacterSet);
if (propertyBag.CharacterSet == "ISO-8859-1")
{
documentEncoding = htmlDoc.DetectEncoding(reader);
}