呼,昨天写程序的时候终于第一次遭遇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"));
看来,以为用不到的东西而略过去的知识,往往成了拦路虎。

昨天写的程序的主要功能就把远程的一个网页保存到本地,关键代码很短:
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"));
看来,以为用不到的东西而略过去的知识,往往成了拦路虎。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步