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 關注
- 1290 瀏覽
添加回答
舉報