HttpWebResponse返回乱码:Telegram Bot网站解析器开发遇问题
解决网站解析器的乱码问题
嘿,我之前做网页爬虫的时候也踩过一模一样的乱码坑,咱们一步步把它搞定!
你说得没错,编码确实是核心问题之一,但还有个容易被忽略的关键点——响应压缩。现在很多网站(包括detmir.ru)会用gzip或deflate压缩页面内容来节省带宽,如果直接读取压缩后的流,肯定会得到乱码。另外,单纯依赖resp.CharacterSet也不一定靠谱,有些网站返回的字符集标识不规范,甚至为空。
修复后的代码
var link = "https://www.detmir.ru/"; var request = (HttpWebRequest)WebRequest.Create(link); // 关键1:告诉服务器我们支持压缩响应,同时自动处理解压 request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate"); request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; using (var resp = (HttpWebResponse)request.GetResponse()) { string result; // 关键2:处理编码——优先用响应头的字符集,没有则兜底用UTF-8(大多数现代网站用这个) Encoding encoding; try { encoding = string.IsNullOrEmpty(resp.CharacterSet) ? Encoding.UTF8 : Encoding.GetEncoding(resp.CharacterSet); } catch (ArgumentException) { // 碰到不识别的字符集,直接用UTF-8兜底 encoding = Encoding.UTF8; } using (var stream = resp.GetResponseStream()) { using (var reader = new StreamReader(stream, encoding)) { result = reader.ReadToEnd(); } } // 关键3:写入文件时指定和读取一致的编码,避免二次乱码 File.WriteAllText(@"d:\1.txt", result, encoding); }
为什么之前的代码会出问题?
- 没处理压缩响应:服务器返回的是压缩后的二进制数据,不是纯文本,直接读肯定乱码。加上
AutomaticDecompression后,HttpWebRequest会自动帮你解压流。 - 编码不可靠:
resp.CharacterSet可能为空,或者返回的字符集名称不标准(比如写的是utf8而不是utf-8),这时候Encoding.GetEncoding会报错,或者用系统默认编码(比如ASCII)导致乱码。我们加了try-catch和兜底逻辑,就能避免这个问题。 - 写入文件编码不匹配:
File.WriteAllText默认用UTF-8无BOM编码,如果读取的编码是其他类型,或者写入时不指定编码,可能导致文件打开后显示乱码。
额外调试技巧
如果还是有问题,可以抓个包看看响应头里的Content-Encoding是不是gzip,以及Content-Type里的charset到底是什么值,这样就能精准定位编码问题啦。
内容的提问来源于stack exchange,提问作者Pavel
相关产品推荐
相关产品推荐

