3 回答
TA贡献1770条经验 获得超3个赞
是八位位组的Windows-1252表示形式EF BB BF。这是UTF-8字节顺序标记,这意味着您的远程网页是以UTF-8编码的,但是您正在阅读它的方式就像是Windows-1252。 根据该文档,WebClient.DownloadString使用Webclient.Encoding它的编码时,它的远程资源转换成字符串。设置为System.Text.Encoding.UTF8,理论上一切都会正常进行。
TA贡献1859条经验 获得超6个赞
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);
}
}
}
(这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);
}
}
因此,在您的示例中,您将执行以下操作:
urlData = wc.DownloadStringAwareOfEncoding(uri);
...就是这样。
- 3 回答
- 0 关注
- 1238 浏览
添加回答
举报