如何解决“UTF-8”不支持编码名称

问题描述 投票:0回答:4

我正在使用 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 标头设置为 "text/xml; charset ="UTF-8"" 请注意 UTF-8 之间的额外“”,如果我这样做,这会导致错误从响应中删除标头,并添加一个新的内容类型标头,其中包含 "text/xml; charset =UTF-8"。请注意,我删除了代码中 UTF-8 周围的额外引号

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

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

问题出在响应标头中 UTF-8 周围的双引号中

c# .net utf-8 dotnet-httpclient .net-standard-2.0
4个回答
2
投票

您可以使用自定义 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.

1
投票

也许在原始字节上强制使用 UTF-8, 像这个

var buffer = await response.Content.ReadAsBufferAsync();
var byteArray = buffer.ToArray();
var responseString = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length);

0
投票

有许多 ASCII 不兼容的编码被广泛使用,特别是在亚洲国家(在 Unicode 兴起之前必须设计自己的解决方案)以及在 Windows、Java 和 .NET CLR 等平台上,其中许多 API 接受文本为 UTF -16 编码数据。

你可以...

将其作为文件对象传递给python,使用编码模块来回更改它。这项技术使 Python 成为 C++ 人员的“粘合剂”语言。

再一次,只是我的意见。

但我强烈建议你接受Georgy Tarasovs的回答


0
投票

@Georgy Tarasov 的修改对我来说是必要的,因为 utf8 页面不断失败,因为它发送了轻微的变化。

public class Utf8EncodingProvider : EncodingProvider
{
    private static readonly HashSet<string> Utf8Encoders = new HashSet<string>(
        new string[] { "utf-8", "utf8", "\"UTF-8\"" }
    );

    public override Encoding GetEncoding(string name)
    {
        if (Utf8Encoders.Contains(name))
        {
            return Encoding.UTF8;
        }

        return null;
    }

    public override Encoding GetEncoding(int codepage)
    {
        return null;
    }

    public static void Register()
    {
        Encoding.RegisterProvider(new Utf8EncodingProvider());
    }
}

别忘了打电话

Utf8EncodingProvider.Register();

可以转换

name.toLower()
以获得更多点击量

© www.soinside.com 2019 - 2024. All rights reserved.