"UTF8"不是一种支持的编码名称。

21

我正在玩弄Spotify的Web API,试图访问我的最受欢迎的音轨,但是我遇到了一个问题,已经尝试解决几个小时了,但找不到答案。

当我尝试对响应进行反序列化时,会出现以下错误:

'UTF8' 不是受支持的编码名称。有关定义自定义编码的信息,请参见 Encoding.RegisterProvider 方法的文档。 参数名称: name ContentType 中提供的字符集无效。不能使用无效字符集读取内容作为字符串。

ContentType 是 application/json; charset=UTF8

有什么想法吗?

这是我的请求代码:

private static HttpClient GetHttpClient()
{
    HttpClientHandler handler = new HttpClientHandler() {
        AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
    };
    var httpClient = new HttpClient(handler);
    httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
    return httpClient;
}

public async Task<SearchArtistResponse> GetSelfTopAsync(string type, string userName)
{
    var httpClient = GetHttpClient();
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", GetAccessToken(userName));

    var sb = new StringBuilder();
    sb.Append(ApiUrl);
    sb.Append($"/me/top/{type}");
    var query = sb.ToString();
    var response = await httpClient.GetAsync(query);

    var spotifyResponse = JsonConvert.DeserializeObject<SearchArtistResponse>(await response.Content.ReadAsStringAsync());
    return spotifyResponse;
}

我认为这只是Spotify Web API中的一个错误,该端点发送charset=UTF8而不是charset=utf-8。它已在此处提交:https://github.com/spotify/web-api/issues/291 - jooon
我通过指定代理解决了一个类似的问题。 - Brent Bradburn
您可以在交给反序列化程序之前先预读并修复错误... - Nyerguds
3个回答

29

您是否正在使用.NET Core?

如果想在您的环境中使用在.NET桌面应用程序中可用的编码,您将需要添加以下代码:

System.Text.EncodingProvider provider = System.Text.CodePagesEncodingProvider.Instance;
Encoding.RegisterProvider(provider);

有关CodePagesEncodingProvider.Instance的更多信息,请在此处查找。


不,我正在使用.NET 4.5 @Sephr - Fredrik
那不是这样的...还有其他人吗? - Fredrik
1
这将修复所有编码错误,但不包括:System.ArgumentException:“iso-2022-cn”不是受支持的编码名称。有关定义自定义编码的信息,请参阅Encoding.RegisterProvider方法的文档。 - Ronen Festinger
这解决了我使用一个抛出编码错误的外部 .dll 时收到的编码错误。 - hanzolo
修复了这里的问题。 - Nime Cloud
在添加了这行代码之后,httpResponseMessage.Content.ReadAsStringAsync() 也会自动处理像windows-1252这样的编码,而之前会抛出异常,因此无需添加字节数组逻辑提取,直接使用特定编码进行转换即可。 - Iman

20

当您调用ReadAsStringAsync()时,应该验证响应标头Content-Type的问题,如果您改为调用ReadAsByteArrayAsync()并解析为字符串,则可以解决此问题。

(System.Text.Encoding.UTF8.GetString())

那肯定会起作用!!!


最好在接收到的字节中实际检查是否存在“UTF8”字符串,以确保它是_应该_是UTF-8,并且只有在需要修复时才进行修复。 - Nyerguds
还有 Encoding.WebName,在这种情况下可能更加精确。 - Marc Wittke
你让我的一天变得美好 :) - Legion

1
当我尝试从使用C#服务构建的PHP API获取答案时,遇到了同样的问题。通过在PHP端(发送结果到C#服务的API)将"charset=UTF8"更改为"charset=\"UTF-8\"",我解决了这个问题。希望这可以帮助某人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接