如何更改 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 响应的编码的主要内容,如果未能解决你的问题,请参考以下文章
可以为 HttpClient 提供多个 HTTP 消息处理程序吗?
如何从 Httpclient.SendAsync 调用中获取和打印响应
如何使用 HttpClient 在 ASP.Net C# 中禁用分块传输编码