![](/img/trans.png)
[英]HttpWebRequest StreamReader fails with utf-8 is not a supported encoding name error
[英]How to solve "UTF-8" is not supported encoding name
我正在使用 HttpClient 向我無法控制的遠程服務器發送發布請求,並嘗試獲取如下響應
HttpResponseArgs result = //Make the request with HttpClient object ( I am skipping it here)
var stringResult = result?.Content.ReadAsStringAsync().Result; // exception thrown here as "UTF-8" is not supported encoding name
在調試時,我發現遠程服務器響應的 Content-Type header 設置為“text/xml; charset ="UTF-8""請注意 UTF-8 之間的額外“”,如果我從響應中刪除 header,則會導致錯誤並放置一個新的內容類型 header 和"text/xml; charset =UTF-8" 。 請注意我刪除了代碼 UTF-8 周圍的額外報價
result?.Content.ReadAsStringAsync().Result; // works fine now
請建議我能做什么? 我覺得它是 .net 框架中的一個錯誤,因為 postman 可以以正確的方式解釋遠程服務器的響應。
問題出在響應的 header 中 UTF-8 左右的雙引號中
也許強制 UTF-8 超過原始字節,像這樣
var buffer = await response.Content.ReadAsBufferAsync();
var byteArray = buffer.ToArray();
var responseString = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length);
您可以使用自定義EncodingProvider
public class Utf8EncodingProvider : EncodingProvider
{
public override Encoding GetEncoding(string name)
{
return name == "\"UTF-8\"" ? Encoding.UTF8 : null;
}
public override Encoding GetEncoding(int codepage)
{
return null;
}
public static void Register()
{
Encoding.RegisterProvider(new Utf8EncodingProvider());
}
}
根據您的問題代碼使用:
Utf8EncodingProvider.Register(); //You should call it once at startup of your application
HttpResponseArgs result = //Make the request with HttpClient object ( I am skipping it here)
var stringResult = result?.Content.ReadAsStringAsync().Result; // Must be executed without exception.
有許多廣泛使用的 ASCII 不兼容編碼,特別是在亞洲國家(在 Unicode 興起之前必須有自己的解決方案)和 Windows、Java 和 .NET CLR 等平台,其中許多 API 接受文本作為 UTF-16編碼數據。
你可以...
將其作為文件對象傳遞給 python,使用編碼模塊來回更改它。 該技術已確保 python 作為 C++ 人的“膠水”語言。
再一次,只是我的意見。
但我強烈建議你接受 Georgy Tarasovs 的回答
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.