无法判断目标网站编码的解决方法
2015-05-22 14:34
197 查看
/// <summary> /// 函数名称:GetDataFromUrl /// 功能说明:获取url指定的网页的源码 /// 参数:string url用于指定 url /// 参数:ref Encoding encode用来获取网页中的字符集编码 /// </summary> public static string GetDataFromUrl(string url, ref Encoding encode) { string str = string.Empty; HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); //设置http头 request.AllowAutoRedirect = true; request.AllowWriteStreamBuffering = true; request.Referer = ""; request.Timeout = 10 * 1000; request.UserAgent = ""; HttpWebResponse response = null; response = (HttpWebResponse)request.GetResponse(); //根据http应答的http头来判断编码 string characterSet = response.CharacterSet; //Encoding encode; if (characterSet != "") { if (characterSet == "ISO-8859-1") { characterSet = "gb2312"; } encode = Encoding.GetEncoding(characterSet); } else { encode = Encoding.Default; } //声明一个内存流来保存http应答流 Stream receiveStream = response.GetResponseStream(); MemoryStream mStream = new MemoryStream(); byte[] bf = new byte[255]; int count = receiveStream.Read(bf, 0, 255); while (count > 0) { mStream.Write(bf, 0, count); count = receiveStream.Read(bf, 0, 255); } receiveStream.Close(); mStream.Seek(0, SeekOrigin.Begin); //从内存流里读取字符串 StreamReader reader = new StreamReader(mStream, encode); char[] buffer = new char[1024]; count = reader.Read(buffer, 0, 1024); while (count > 0) { str += new String(buffer, 0, count); count = reader.Read(buffer, 0, 1024); } //从解析出的字符串里判断charset,如果和http应答的编码不一直 //那么以页面声明的为准,再次从内存流里重新读取文本 Regex reg = new Regex(@"<meta[\s\S]+?charset=(.*?)""[\s\S]+?>", RegexOptions.Multiline | RegexOptions.IgnoreCase); MatchCollection mc = reg.Matches(str); if (mc.Count > 0) { string tempCharSet = mc[0].Result("$1"); if (string.Compare(tempCharSet, characterSet, true) != 0) { encode = Encoding.GetEncoding(tempCharSet); str = string.Empty; mStream.Seek(0, SeekOrigin.Begin); reader = new StreamReader(mStream, encode); buffer = new char[255]; count = reader.Read(buffer, 0, 255); while (count > 0) { str += new String(buffer, 0, count); count = reader.Read(buffer, 0, 255); } } } reader.Close(); mStream.Close(); if (response != null) response.Close(); return str; }
相关文章推荐
- ajax异步判断网站是否可以访问到的解决方法
- 解决无法浏览网站的几个方法
- 网站无法打开的解决方法
- 网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
- IE无法打开internet网站已终止操作的解决的方法
- Linux下使用goagent,无法打开https网站的解决方法
- Github网站加载不完全,js无法加载解决方法
- SVN提示"由于目标机器积极拒绝,无法连接"的解决方法
- 网站无法打开的解决方法
- vs2012 网站无法使用自定义服务器的解决方法
- 关于无法打开微软网站的解决方法[转]
- 分享“数据模型发布提示编码重复,所有的流程数据模型都无法发布成功”的解决方法
- IIS6.0服务器搭建网站无法访问解决方法
- android开发网站无法访问解决方法
- SVN提示:由于目标机器积极拒绝,无法连接 的解决方法
- “Internet explorer已阻止此网站显示有安全证书错误的内容”“iTunes无法授权”的解决方法
- 安装网站时出现“连接数据库出现数据库服务器或登录密码无效,无法连接数据库,请重新设定”解决方法
- 网站无法打开的解决方法
- 【Window OS】”对于目标文件系统,文件XXXXX过大“导致无法进行文件操作的解决方法
- ASP.NET在IE10中无法判断用户已登入及Session丢失问题解决方法