【问题标题】:How to change the encoding of the HttpClient response如何更改 HttpClient 响应的编码
【发布时间】: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 中提供的字符集无效。无法使用无效字符集将内容读取为字符串。

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

【问题讨论】:

    标签: c# asynchronous windows-8


    【解决方案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();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-23
        • 1970-01-01
        • 1970-01-01
        • 2011-06-15
        • 1970-01-01
        • 2017-09-02
        • 2019-06-23
        • 1970-01-01
        相关资源
        最近更新 更多