【发布时间】:2011-06-10 15:06:45
【问题描述】:
对于我正在构建的屏幕抓取工具,我们从网络下载的一些内容存在问题。
在下面的代码中,从 web 客户端下载字符串方法返回的字符串为少数(不是所有)网站的源下载返回了一些奇怪的字符。
我最近添加了如下的 http 标头。以前,相同的代码在没有标题的情况下被调用以达到相同的效果。我没有尝试过“Accept-Charset”标头的变体,除了基础知识之外,我对文本编码知之甚少。
我所指的字符或字符序列是:
“”
和
"一个"
当您在网络浏览器中使用“查看源代码”时,看不到这些字符。这可能是什么原因造成的,我该如何解决这个问题?
string urlData = String.Empty;
WebClient wc = new WebClient();
// Add headers to impersonate a web browser. Some web sites
// will not respond correctly without these headers
wc.Headers.Add("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12");
wc.Headers.Add("Accept", "*/*");
wc.Headers.Add("Accept-Language", "en-gb,en;q=0.5");
wc.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
urlData = wc.DownloadString(uri);
【问题讨论】:
-
我在使用 C# YUI Compessor 来缩小我的 JS 和 CSS 的 Windows 应用程序中遇到了同样的错误。它会在带有您上面提到的确切字符的文件上引发错误。我指定
client.Encoding = Encoding.UTF8;并且它仍然返回时髦的字符......另外我试图弄清楚如何处理C#YUI Compressor引发的错误,例如[ERROR] Invalid Syntax...... -
自从我第一次遇到这个问题以来已经有一段时间了,并且从那以后对文本编码有了一些了解。为了帮助您,基本上您需要做的是尝试将来自 http 标头的编码与响应相匹配。从那里使用检测到的编码解码字节流。如果标头中未包含编码,则使用 UTF8 解码,然后在 HTML 文档中查找编码。如果 HTML 文档中仍然没有,则只剩下启发式方法。我已经阅读了各种机制,但这里没有简单的解决方案。
-
下次有机会我会在这里发布一些代码。
-
在我的情况下,返回的数据是 gzip 压缩的,必须先解压缩,所以我发现这个答案很有帮助:stackoverflow.com/a/34418228/74585
标签: c# asp.net .net character-encoding special-characters