gb2*_*b2d 62 .net c# asp.net character-encoding special-characters
我有一些问题,我们正在从网上下载我正在构建的屏幕抓取工具.
在下面的代码中,从Web客户端下载字符串方法返回的字符串为少数(不是所有)网站的源下载返回一些奇怪的字符.
我最近添加了http标头,如下所示.以前调用相同的代码而没有标题达到相同的效果.我没有尝试过'Accept-Charset'标题的变体,除了基础知识之外,我对文本编码知之甚少.
我引用的字符或字符序列是:
"  "
和
" Â "
在Web浏览器中使用"查看源"时,看不到这些字符.可能导致这种情况的原因是什么?如何纠正这个问题?
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);
Run Code Online (Sandbox Code Playgroud)
dka*_*arp 99
是octets的windows-1252表示EF BB BF.这是UTF-8字节顺序标记,这意味着您的远程网页以UTF-8编码,但您正在阅读它,就像它是windows-1252一样. 根据该文档,WebClient.DownloadString使用Webclient.Encoding它的编码时,它的远程资源转换成字符串.设置它,System.Text.Encoding.UTF8理论上应该工作.
Kon*_*man 49
WebClient.DownloadString实施的方式非常愚蠢.它应该从Content-Type响应中的头部获取字符编码,但是它希望开发人员事先告诉预期的编码.我不知道这个班的开发人员在想什么.
我创建了一个辅助类,它从Content-Type响应的头部检索编码名称:
public static class WebUtils
{
public static Encoding GetEncodingFrom(
NameValueCollection responseHeaders,
Encoding defaultEncoding = null)
{
if(responseHeaders == null)
throw new ArgumentNullException("responseHeaders");
//Note that key lookup is case-insensitive
var contentType = responseHeaders["Content-Type"];
if(contentType == null)
return defaultEncoding;
var contentTypeParts = contentType.Split(';');
if(contentTypeParts.Length <= 1)
return defaultEncoding;
var charsetPart =
contentTypeParts.Skip(1).FirstOrDefault(
p => p.TrimStart().StartsWith("charset", StringComparison.InvariantCultureIgnoreCase));
if(charsetPart == null)
return defaultEncoding;
var charsetPartParts = charsetPart.Split('=');
if(charsetPartParts.Length != 2)
return defaultEncoding;
var charsetName = charsetPartParts[1].Trim();
if(charsetName == "")
return defaultEncoding;
try
{
return Encoding.GetEncoding(charsetName);
}
catch(ArgumentException ex)
{
throw new UnknownEncodingException(
charsetName,
"The server returned data in an unknown encoding: " + charsetName,
ex);
}
}
}
Run Code Online (Sandbox Code Playgroud)
(UnknownEncodingException是一个自定义的异常类,InvalidOperationException如果你想要,可随意更换或其他任何东西)
然后,WebClient类的以下扩展方法将起到作用:
public static class WebClientExtensions
{
public static string DownloadStringAwareOfEncoding(this WebClient webClient, Uri uri)
{
var rawData = webClient.DownloadData(uri);
var encoding = WebUtils.GetEncodingFrom(webClient.ResponseHeaders, Encoding.UTF8);
return encoding.GetString(rawData);
}
}
Run Code Online (Sandbox Code Playgroud)
所以在你的例子中你会这样做:
urlData = wc.DownloadStringAwareOfEncoding(uri);
Run Code Online (Sandbox Code Playgroud)
......就是这样.
San*_*tel 14
var client = new WebClient { Encoding = System.Text.Encoding.UTF8 };
var json = client.DownloadString(url);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
56935 次 |
| 最近记录: |