导航
  • 主页
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm
  • WPF
  • 问答

用HTTPWebrequest的CharacterSet属性时,结果总是空字符

quou2002 2006-03-23 01:38:50
愿意想通过HTTPWebrequest 和HttpWebResponse得到网页源代码,程序如下:

HttpWebRequest httpReq ;
HttpWebResponse httpResp ;
Uri httpUrl = new Uri("http://www.microsoft.com");
httpReq = (HttpWebRequest)WebRequest.Create(httpUrl);

httpResp = (HttpWebResponse)httpReq.GetResponse();
site.ResponseUrl = httpResp.ResponseUri.ToString();//这里赋值ResponseUrl
// httpReq.KeepAlive = false; //获取或设置一个值,该值指示是否与 Internet 资源建立持久连接

StreamReader reader = new StreamReader(httpResp.GetResponseStream(),System.Text.Encoding.Default);
sourceCode = reader.ReadToEnd(); //网页源代码

但是遇到了CharacterSet为UTF-8的网站时,得到的源代码为乱码。如果将高亮部分改为“System.Text.Encoding.UTF-8”,这些网站可以正确得到源代码,但是GB2312编码的网站又出错。察看msdn,HTTPWebrequest 的CharacterSet 属性可以返回该网站编码,可是不管哪类网站,此处值总为空字符串。(本意想通过这得到编码字符串,再调用System.Text.Encoding.GetEncoding()的)

搜索了google,类似问题没有。http://channel9.msdn.com/ShowPost.aspx?PostID=166867#166867 上看见有人报告了HttpWebResponse中get_CharacterSet()函数的bug,其实也和我想解决的无关,虽说是个bug,其实无影响。找到HttpWebResponse.cs(HttpWebResponse函数源码),http://dotnet.di.unipi.it/content/sscli/docs/doxygen/fx/bcl/httpwebresponse_8cs-source.html,也没解决问题。

----在blog上(http://blog.csdn.net/quou2002/archive/2006/03/23/633130.aspx)放放把,同时也在csdn里问问,以后再说了只能。

...全文
543 点赞 收藏 8
写回复
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
quou2002 2006-03-24
感谢‘net_lover’的回复。我已解决。借鉴了net_lover思路中用Content-Type来判断。具体过程还是参见了HttpWebResponse.cs(HttpWebResponse类实现的源码),代码如下:
================================================
//得到CharacterSet,详见http://blog.csdn.net/quou2002/archive/2006/03/23/633130.aspx
private string getEncoding (HttpWebResponse httpResp)
{
string contentType = httpResp.ContentType ;//类似“Content-Type: text/html; charset=utf-8;”或“Content-Type: text/html; charset=utf-8”或者“Content-Type: text/html”//注意utf-8后面有可能没有分号
int i = contentType.IndexOf("charset=");
if (i>=0)
{
i += 8;
int j = contentType.IndexOf(';', i);
if (j>=i)
{
return contentType.Substring(i,j-i).Trim();
}
return contentType.Substring(i);
}
return string.Empty;
}
===================================
只是现在还是不解,HTTPWebrequest的CharacterSet函数为何在我测试的多个不同语言类型网站时,始终为空字符。明显微软写这个函数的目的就是应该可以直接得到charset的(个人看法)。HttpWebResponse.cs(HttpWebResponse类实现的源码,地址见上)中的CharacterSet函数还涉及到MediaType属性(这个属性值我测试也始终为空字符),具体原因有时间再找答案。
而且我还发现有些网站的ContentType中的charset并非符合RFC规范,例如groups.msn.com,它的utf-8后面就多了一个分号。所以就有了上面代码中的return contentType.Substring(i)一句。

最后,感谢大家的回复及提供的思路。过2天再揭帖,希望有兴趣的朋友可以继续探讨此问题。
回复
ttlrwdl 2006-03-23
强 收藏
回复
孟子E章 2006-03-23
修改后的

private void WebRequestButton_Click(object sender, System.EventArgs e)
{
PageUrl = UrlText.Text;
WebRequest request = WebRequest.Create(PageUrl);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream resStream = response.GetResponseStream();
StreamReader sr;
string encoding = "";
string contenttype = response.Headers["Content-Type"];
Response.Write ("contenttype = " + contenttype);
if(contenttype.ToLower().IndexOf("charset") == -1)
{
contenttype = "";
}

if( contenttype != "")
{
string[] headers = System.Text.RegularExpressions.Regex.Split(contenttype,";");
for(int i = 0;i < headers.Length; i++)
{
if(headers[i].ToLower().IndexOf("charset") > -1)
{
encoding = System.Text.RegularExpressions.Regex.Split(headers[i],"=")[1];
break;
}
}
}


if(encoding == "")
sr= new StreamReader(resStream, System.Text.Encoding.Default);
else
{
sr= new StreamReader(resStream, System.Text.Encoding.GetEncoding(encoding));
}
ContentHtml.Text = sr.ReadToEnd();
resStream.Close();
sr.Close();
}
回复
孟子E章 2006-03-23
修改一下
要先判断contenttype是否有charset再进行substring
回复
孟子E章 2006-03-23

http://community.csdn.net/HomePage/
进行测试正确
回复
孟子E章 2006-03-23
可以这样

private void WebRequestButton_Click(object sender, System.EventArgs e)
{
PageUrl = UrlText.Text;
WebRequest request = WebRequest.Create(PageUrl);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream resStream = response.GetResponseStream();
StreamReader sr;
string encoding = "";
string contenttype = response.Headers["Content-Type"];
if( contenttype != "")
{
encoding = contenttype.Substring(contenttype.LastIndexOf("=")+1);
}


if(encoding == "")
sr= new StreamReader(resStream, System.Text.Encoding.Default);
else
{
sr= new StreamReader(resStream, System.Text.Encoding.GetEncoding(encoding));
}
ContentHtml.Text = sr.ReadToEnd();
resStream.Close();
sr.Close();
}
回复
Knight94 2006-03-23
gz
回复
李洪喜 2006-03-23
使用unicode
看看行不行、
回复
发动态
发帖子
C#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.