如何更改 HttpClient 响应的编码

Posted

技术标签:

【中文标题】如何更改 HttpClient 响应的编码【英文标题】:How to change the encoding of the HttpClient response 【发布时间】:2012-08-27 12:45:12 【问题描述】:

我正在尝试学习使用 VS2012 及其 Async Await 关键字的异步编程。这就是我写这段代码的原因:

protected override async void OnNavigatedTo(NavigationEventArgs e)

    string get = await GetResultsAsync("http://saskir.medinet.se");

    resultsTextBox.Text = get;


private async Task<string> GetResultsAsync(string uri)

    HttpClient client = new HttpClient();

    return await client.GetStringAsync(uri);

问题是当我尝试调试应用程序时,它给了我一条错误消息:

ContentType 中提供的字符集无效。无法使用无效字符集将内容读取为字符串。

我猜这是因为该网站有一些瑞典字符,但我找不到如何更改响应的编码。有人可以指导我吗?

【问题讨论】:

【参考方案1】:

您可能需要检查编码选项并获得正确的选项。否则,此代码应该让您继续响应。

private async Task<string> GetResultsAsync(string uri)

    var client = new HttpClient();
    var response = await client.GetByteArrayAsync(uri);
    var responseString = Encoding.Unicode.GetString(response, 0, response.Length - 1);
    return responseString;

【讨论】:

感谢您的帮助,仅将Unicode更改为UTF8后,它就解决了问题。但我真的不明白为什么我的初始代码不起作用。知道为什么吗? 在您的代码中,“GetStringAsync”使用默认编码并尝试获取失败的字符串。使用“GetByteArrayAsync”,结果为 byte[] 形式,不会导致编码问题。【参考方案2】:

如果您想要一个更通用的方法,在我的 UWP 案例中进行以下工作,以防有人使用 Unicode,添加 if:

var response = await httpclient.GetAsync(urisource);

if (checkencoding)

    var contenttype = response.Content.Headers.First(h => h.Key.Equals("Content-Type"));
    var rawencoding = contenttype.Value.First();

    if (rawencoding.Contains("utf8") || rawencoding.Contains("UTF-8"))
    
        var bytes = await response.Content.ReadAsByteArrayAsync();
        return Encoding.UTF8.GetString(bytes);
    

【讨论】:

【参考方案3】:

WinRT 8.1 C#

using Windows.Storage.Streams;
using System.Text;
using Windows.Web.Http;

// in some async function

Uri uri = new Uri("http://something" + query);
HttpClient httpClient = new HttpClient();

IBuffer buffer = await httpClient.GetBufferAsync(uri);
string response = Encoding.UTF8.GetString(buffer.ToArray(), 0, (int)(buffer.Length- 1));

// parse here

httpClient.Dispose();

【讨论】:

以上是关于如何更改 HttpClient 响应的编码的主要内容,如果未能解决你的问题,请参考以下文章

Windows Phone 7上的超时httpClient

可以为 HttpClient 提供多个 HTTP 消息处理程序吗?

如何从 Httpclient.SendAsync 调用中获取和打印响应

如何使用 HttpClient 在 ASP.Net C# 中禁用分块传输编码

jmeter中HTTPclient 3.1和HTTP client 4的响应时间差异

Angular:如何扩展 HttpClient?