"UTF-8" is not supported encoding name 如何解决

How to solve "UTF-8" is not supported encoding name

我正在使用 HttpClient 向我无法控制的远程服务器发送 post 请求并尝试获得如下响应

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"" 请注意,如果我从响应中删除 header 并使用 放置新的 content-Type header,UTF-8 之间的额外“”会导致错误” text/xml;字符集=UTF-8。请注意我删除了围绕 UTF-8 代码的额外引号

result?.Content.ReadAsStringAsync().Result; // works fine now

请建议我能做什么?我觉得它是 .net 框架中的一个错误,因为 postman 可以正确地解释远程服务器的响应。

问题出在响应 header 中围绕 UTF-8 的双引号

也许对原始字节强制使用 UTF-8, 像 this

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 的回答