旋风

Communication comes from our hears and heads! my msn:youpeizun@hotmail.com


posts - 81, comments - 303, trackbacks - 23, articles - 1

问题:
   网爬工具中自动搜集页面信息时,有的页面出现了出现乱码现象
原因:
   读取页面信息是使用了错误的编码类型。C#.NET从现在的类中获取得来的编码信息有时是错误的,本人认为对不是ASP.NET的应用程序,它读过来的编码信息都是错误的。
解决:
   思路:必须先在运行时获取得该页面的编码,再去读取页面的内容,这样得来的页面内容才不会出现乱码现象。
   方法:
   1:使用ASCII编码去读取页面内容。
   2:使用正则表达式从读取的页面内容中筛选出页面的编码信息。上个步骤获取的页面信息可能会有乱码。但HTML标志是正确的,所有可以从HTML标志中得到编码的信息。
   3.用正确的编码类型去读取页面信息。
   如果哪位有更好的方法,请多赐教啊!

  
   下面附上代码:   

代码演示

 http://www.gdqy.edu.cn页面的使用的编码格式是:gb2312
第一个方法显示的内容是:
context type:text/html
charset:ISO-8859-1
content encoding:
第二个方法显示的内容是:
charset:gb2312

所以第一个方法获取的信息是错误的,第二个方法是对的。
为什么第一个方法获取的的编码格式是:ISO-8859-1呢?
我用Reflector反射工具获取了CharacterSet属性的源代码,从中不难看出其原因。如果能获取出ContentType属性的源代码就不以看出其出错的原因了,但是搞了许久都没找出,如果那位那补上,那就太感谢了。
下面我附上Reflector反射工具获取了CharacterSet属性的源代码,有兴趣的朋友看一看。 

CharacterSet源码


结束! 

Feedback

#1楼    回复  引用  查看    

2007-01-21 22:21 by T.t.T!Ck.      
good
测试一下这个思路先

#2楼    回复  引用  查看    

2007-01-21 23:38 by anikin      
这样做会导致一个页面爬两次,增大系统的开销,带宽的开销,能不能只爬一次解决问题?

#3楼 [楼主]   回复  引用  查看    

2007-01-22 00:31 by xuanfeng      
在设计时,你可以后个页面使用前个页面的编码来抓取,然后再对编码进行判断,如果两个页面编码不一致,则可以重新抓到;一致的话那就不重复了!

#4楼    回复  引用  查看    

2007-01-22 07:44 by 马哥      
有些页面根本就没有Charset,你啷个办咯?

#5楼    回复  引用  查看    

2007-01-22 08:48 by 言学      
可以把第一次抓回来的页面作一个编码格式转化!呵呵!

#6楼    回复  引用  查看    

2007-01-22 09:15 by -天道酬勤      
WebClient ws = new WebClient();
ws.Encoding = System.Text.UnicodeEncoding.Default;
string strHtml = ws.DownloadString(url);

#7楼    回复  引用    

2007-01-22 09:40 by Alexander.Li [未注册用户]
WebClient的Encoding不行,我看过生成的IL,它是直接用的default
其实要解决很简单,用WebResponse取回来的Encoding,判断一下
如果不是UTF8就用default,如果是的话就用UTF8,经过我测试,绝大
部分网页是没有问题的,但是不保证少数很特殊的,希望有大大验证一下
给个结论

#8楼    回复  引用    

2007-01-22 09:46 by 大波波娃 [未注册用户]
我是先用下载的网页保存成二进制流到内存,用头里滴编码信息预解码,然后用正则去找到charset,如果和头里的编码不一致,就用HTML里声明的编码在解码一次,反之就直接用这个预解码的结果呗。

#9楼    回复  引用  查看    

2007-01-22 15:00 by 仰天一笑      
good.我先前的一个项目就是用这个思路解决的。

#10楼    回复  引用    

2007-07-30 23:27 by 殷双太 [未注册用户]
UTF8类型可能不行 我做的时候明显有很多乱码的
我暂时用gb2312 情况还好
楼主的方法应该是不错的方法 呵呵

#11楼    回复  引用    

2008-04-09 20:32 by vivee [未注册用户]
StreamReader sr = new StreamReader(stream, True);
这样好像就不会乱了,欢迎测试下!!!

#12楼 [楼主]   回复  引用  查看    

2008-04-10 14:28 by xuanfeng      
此构造函数将编码初始化为 UTF8Encoding,使用 stream 参数初始化 BaseStream 属性,并将内部缓冲区初始化为默认大小。

detectEncodingFromByteOrderMarks 参数通过查看流的前三个字节来检测编码。如果文件以适当的字节顺序标记开头,该参数自动识别 UTF-8、Little-Endian Unicode 和 Big-Endian Unicode 文本。有关更多信息,请参见 Encoding..::.GetPreamble 方法。

#13楼    回复  引用  查看    

2008-07-16 13:59 by 要有好的心情      
StreamReader sr = new StreamReader(stream, True);
肯定不行,这是针对文件的,而response.GetResponseStream();无法确定Encoding,不但与charset有关,还与web 响应的真实Encoding有关

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-04-15 12:14 编辑过


相关链接: