簡體   English   中英

如何解決“UTF-8”不支持編碼名稱

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM