理想与现实之间

学习的最好方法就是blog

博客园 首页 新随笔 联系 订阅 管理
  68 Posts :: 0 Stories :: 418 Comments :: 12 Trackbacks
呼,昨天写程序的时候终于第一次遭遇Encoding了。在以前看"applied microsoft .net framework programming"的时候把讲Encoding的这一段完全的给跳过去了,现在果然遭报应了。 

昨天写的程序的主要功能就把远程的一个网页保存到本地,关键代码很短:

string query = "http://....";
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(query);
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
StreamReader sr = new StreamReader(resp.GetResponseStream());
string path = "C:\\....";
StreamWriter sw = new StreamWriter(path,false);
sw.Write(sr.ReadToEnd());

然而,保存下来的网页都是乱码(这个是当然的,因为.net默认使用utf-8编码,而那些网页都是GB2312的,请别取笑我..当时我真不知道...) 我当然想到可能是编码的问题,查了下msdn发现StreamReader的构造函数里以Encoding类做为参数的重载版本。然而问题是Encoding类下只有有限的几个编码(utf-16 utf-8 acsii...)没有我要的GB2312。

不得以,只得找出"applied microsoft .net programming"把曾经跳过的那一段重新看了一编,才知道原来要使用Encoding.GetEncoding()方法。把程序改成下面这样就没问题了:

     string query = "http://...";
     HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(query);
     HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
     StreamReader sr = new StreamReader(resp.GetResponseStream(),Encoding.GetEncoding("GB2312"));
     string path = "C:\\....";
     StreamWriter sw = new StreamWriter(path,false,Encoding.GetEncoding("GB2312"));

看来,以为用不到的东西而略过去的知识,往往成了拦路虎。
posted on 2004-03-16 20:58 Justin Shen 阅读(2270) 评论(11)  编辑 收藏 网摘

Feedback

#1楼  2004-03-16 21:29 coollzh      
两年前我刚学.net的时候犯的错误和你非常像,不过我是post数据到月面,还是思归帮我解决的,至今记忆犹新:)
  回复  引用  查看    

#2楼  2004-03-17 08:50 hUOBAZI [未注册用户]
我在写我的主页程序的时候也是这样的 生成的html文件显示全部乱码
  回复  引用    

#3楼  2004-03-17 08:54 Meyer      
还有阿
脚本,样式表如果不是utf8格式,而里面有中文时就完蛋了
  回复  引用  查看    

#4楼  2004-03-17 11:47 小春 [未注册用户]
还有哪,在用VS.NET生成的WEB 页它是UFT-8代码的,你要将它转为GB2312:)
  回复  引用    

#5楼  2004-03-17 12:02 小春 [未注册用户]
Dim http As String = TextBox2.Text
Dim req As HttpWebRequest = CType(HttpWebRequest.Create(http), HttpWebRequest)
Dim resp As HttpWebResponse = CType(req.GetResponse(), HttpWebResponse)
Dim sr As StreamReader = New StreamReader(resp.GetResponseStream(), System.Text.Encoding.GetEncoding("gb2312"))
TextBox1.Text = sr.ReadToEnd

哈哈,我的怎么保存下来怎么是乱码
  回复  引用    

#6楼  2004-03-18 22:12 dudu      
我觉得这样写比较好:
StreamWriter sw = new StreamWriter(path,false,sr.CurrentEncoding);
我试过了,保存的网页不会乱码。

  回复  引用  查看    

#7楼  2004-03-18 22:21 Justin Shen      
然而前面似乎还是要这样写:
StreamReader sr = new StreamReader(resp.GetResponseStream(),Encoding.GetEncoding("GB2312"));
不然就乱码了。 我猜测 HttpWebResponse 对象应该带有Encoding信息,然而遇到了一点问题,请看这里



  回复  引用  查看    

#8楼  2004-03-18 22:35 dudu      

不需要吧,我的测试代码是这样的:

     string
query = textBox1.Text;

              HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(query);

              HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

              StreamReader sr = new StreamReader(resp.GetResponseStream());

              string path = "F:\\save.htm";

              StreamWriter sw = new StreamWriter(path,false,sr.CurrentEncoding);

              sw.Write(sr.ReadToEnd());

              sw.Flush();

              sw.Close();
             
              不信你试试,sr.CurrentEncoding值是UTF8.


  回复  引用  查看    

#9楼  2004-03-19 12:31 Justin Shen      
我试过了 是乱码呀,因为我抓的网页的编码是GB2312的呀。

你是不是用 博客园 的网页来试验的? 博客园是aspx的网页,默认就是utf-8的,所以解码正确了呀。
  回复  引用  查看    

#10楼  2004-03-19 12:35 dudu      
不好意思!是用博客园的网页试验的!
  回复  引用  查看    

#11楼  2004-03-26 11:16 Samuel      
呵呵,我曾经碰到过编码的问题,总结了一篇
http://www.cnblogs.com/samuel/archive/2004/03/25/4182.aspx
  回复  引用  查看    





标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接: