原因分析:首先,目前大多数网站为了提升网页浏览传输速率都会对网站内容在传输前进行压缩,最常用的是GZIP压缩解压解压算法,也是支持最广的一种。

因为网站传输时采用的是GZIP压缩传输,如果我们接受webrespones接受数据未按照GZIP进行解压显示,那么就会造成乱码,如何知道网站是否是GZIP或者其他压缩方式传输的呢?

我这里用360浏览器做例子,如下图

可以看到,百度传输方式为gzip,deflate方式发给客户端数据 知道了原因我们下面来解决问题

2、通过GZIP解压

方法如下,此方法作用是输入url地址,返回一个解压后的string内容字符串。

//定一个解码gzip压缩格式网页的方法
private static string getGzip(string u)
{
StringBuilder sb = new StringBuilder(204800);//200K对于频繁拼接的字符串,用stringbuilder比string节约内存和提升性能
WebClient wc = new WebClient();//定义一个发送和接收web数据的公用方法类。
wc.Headers[HttpRequestHeader.AcceptEncoding]="gzip,deflate";//接收gzip类型的数据
wc.Headers[HttpRequestHeader.AcceptLanguage]="zh-CN,zh";//指定请求头的语言类型为中文, 
byte[] buffer= wc.DownloadData(u);//将 wc对象的downloaddata()方法下载到的资源存入本地buffer中
GZipStream g=new GZipStream((Stream)(new MemoryStream(buffer)),CompressionMode.Decompress);//定义一个压缩或者解压流的对象,设置为解压
byte[] tmpbuffer=new byte[20480];//定一个20K的临时字节数组
int len=g.Read(tmpbuffer,0,20480); // 
while(len>0)
{
sb.Append(Encoding.Default.GetString(tmpbuffer,0,len));  //转换成相应的格式,比如使用的是GBK我们默认就是default,如果是UTF-8就写成UTF-8。这个可以通过右键查看源码找到编码格式。
len=g.Read(tmpbuffer,0,20480); 
}
g.Close(); 
return sb.ToString();

c# 关于抓取网页源码后中文显示乱码的原因分析和解决方法的更多相关文章

  1. [转]Linux Socket编程 Socket抓取网页源码

    “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...

  2. 使用Socket抓取网页源码

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...

  3. 使用Selenium+firefox抓取网页指定firefox_profile后的问题

    from: https://blog.csdn.net/chufazhe/article/details/51145834 摘要:在使用selenium和firefox抓取网页指定firefox_pr ...

  4. g++编译后中文显示乱码解决方案(c++)

    g++编译后中文显示乱码解决方案   环境:Windows 10 专业版 GCC版本:5.3.0 测试代码: 1 #include <iostream> 2 using namespace ...

  5. Java---网络蜘蛛-网页邮箱抓取器~源码

    刚刚学完Socket,迫不及待的做了这个网页邮箱抓取~~~ 现在有越来越多的人热衷于做网络爬虫(网络蜘蛛),也有越来越多的地方需要网络爬虫,比如搜索引擎.资讯采集.舆情监测等等,诸如此类.网络爬虫涉及 ...

  6. 在android源码环境下写上层应用的一个初步解决方法

    在android源码环境下编写上层应用,一直以来我都觉得很麻烦.因为如果单纯将应用导入eclipse,那么framework层一些定制的API无法自动提示和补全,使用起来不太方便:如果将整个andro ...

  7. SQLServer乱码问题的分析及解决方法(中文字符被存入数据库后,显示为乱码)

    注:本文为个人转存,原文地址:http://blog.csdn.net/qiuyu8888/article/details/8021410 问题:SQL版在使用过程中有时会出现乱码,我的症状是中文字符 ...

  8. MATLAB更换字体后 中文显示乱码问题

    MATLAB的脚本代码默认宋体显示,对于大多数720P的显示器来说,无论是中文还是英文,显示效果都非常差.Windows环境下,Consolas是一种比较理想的英文代码字体. Consolas 字体是 ...

  9. STM32 HAL库关于串口中断烧录程序后可以正常运行,断电重启后无法进入中断的问题分析以及解决方法

    1.情景描述: 最近在做一个项目,X86的上位机通过串口控制MCU,使用串口中断接收上位机数据时,MCU在上电的情况下烧录程序,可以正常接收上位机的数据,在断电重启后,一直进入不了中断回调函数,上电的 ...

随机推荐

  1. C#的WinForm窗体美化

    为了帮助用户追求美观,.NET 4.0 专门为对此有需求的人提供了IrisSkin4.dll皮肤引用集,里面封装了许多对窗体重新描绘的方法,再搭配上WinForm特有的 .ssk 文件,就可以实现窗体 ...

  2. 移除sitemap中的entity

    下面截图是sitemap所在的位置 如果遇到什么原因,当前使用的entity被弃用需要删除,必须要把当前site map 引用的entity也一并删除. 不然会导致site map不能正常加载

  3. 【自制操作系统06】终于开始用 C 语言了,第一行内核代码!

    一.整理下到目前为止的流程图 写到这,终于才把一些苦力活都干完了,也终于到了我们的内核代码部分,也终于开始第一次用 c 语言写代码了!为了这个阶段性的胜利,以及更好地进入内核部分,下图贴一张到目前为止 ...

  4. 3分钟接入socket.io使用

    WebSocket 简介 传统的客户端和服务器通信协议是HTTP:客户端发起请求,服务端进行响应,服务端从不主动勾搭客户端. 这种模式有个明显软肋,就是同步状态.而实际应用中有大量需要客户端和服务器实 ...

  5. obj2gltf安装详细教程

    在线转换地址:http://52.4.31.236/convertmodel.html 在使用cesium的过程中需要使用到gltf模型,官方推荐使用obj2gltf插件将obj模型转换成gltf格式 ...

  6. Shell常用语句及结构

    条件判断语句之if if 语句通过关系运算符判断表达式的真假来决定执行哪个分支:shell有三种if语句样式,如下: 语句1 if [ expression ] then Statement(s) t ...

  7. Java 加密/解密Excel

    概述 设置excel文件保护时,通常可选择对整个工作簿进行加密保护,打开文件时需要输入密码:或者对指定工作表进行加密,即设置表格内容只读,无法对工作表进行编辑.另外,也可以对工作表特定区域设置保护,即 ...

  8. 文件系统(02):基于SpringBoot框架,管理Xml和CSV文件类型

    本文源码:GitHub·点这里 || GitEE·点这里 一.文档类型简介 1.XML文档 XML是可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言.标记指计算机所能理解的信息符号,通过 ...

  9. Flutter 入门 --- 内部分享

    八月部门给分配的分享任务,由于项目太赶,推迟一个月. 选 Flutter 这个主题,是因为现在它慢慢流行起来了,而我却不了解,故而借此契机,上手试试. 简介 Flutter 是 Google 推出的跨 ...

  10. 利用AppMetrics对Web进行监控教程

    利用AppMetrics对Web进行监控教程 一.基础准备 1. 安装依赖 这里可以通过nuget或使用命令行进行安装,具体需要安装的类库如下(注意版本): Install-Package App.M ...