You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用HttpRequestMessage调用API遇编码异常及CSV乱码问题求助

编码乱码问题的修复方案

问题根源

你的问题是编码不匹配导致的:

  • API返回的\u2019是Unicode标准的右单引号,本身并非乱码,但后续转CSV时出现的’是典型的UTF-8编码被错误当作ISO-8859-1/Windows-1252解析的结果。
  • 请求时未明确指定编码要求,可能导致API返回非UTF-8响应,或HttpClient默认解析编码出错。

具体修复步骤

1. 添加请求头明确要求UTF-8编码

在HttpRequestMessage的Headers中新增Accept-Charset,强制API返回UTF-8格式的响应:

var httpRequestMessage = new HttpRequestMessage
{
    Method = HttpMethod.Get,
    RequestUri = new Uri(uri),
    Headers = {
        { "Authorization", $"Bearer {oauth2_token}"},
        { "x-api-key", apiKey},
        { "Accept-Charset", "utf-8"} // 新增此请求头
    }
};

2. 强制指定响应解析编码

即使API响应头未正确声明编码,也强制用UTF-8解析内容,避免HttpClient自动识别错误:

// 替换原ReadAsStringAsync代码
var encoding = responseContent.Headers.ContentType?.CharSet != null 
    ? Encoding.GetEncoding(responseContent.Headers.ContentType.CharSet) 
    : Encoding.UTF8;
var data = await responseContent.ReadAsStringAsync(encoding);

注意:建议用await替代.Result,同步调用异步方法容易引发死锁,优化后的异步方法更稳定。

3. CSV转换时保持编码一致

使用CsvWriter时,明确指定UTF-8编码,确保输出文件编码正确:

using (var writer = new StreamWriter("output.csv", false, Encoding.UTF8))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
    // 执行CSV写入逻辑
}

可选优化

如果需要将Unicode的\u2019直接替换为英文单引号',可以在获取响应后添加替换逻辑:

data = data.Replace("\u2019", "'");

优化后的完整代码

public static async Task<string> GetResponse_CFRA(string oauth2_token, string apiKey, string uri)
{
    var httpRequestMessage = new HttpRequestMessage
    {
        Method = HttpMethod.Get,
        RequestUri = new Uri(uri),
        Headers = {
            { "Authorization", $"Bearer {oauth2_token}"},
            { "x-api-key", apiKey},
            { "Accept-Charset", "utf-8"}
        }
    };

    using (var client = new HttpClient())
    {
        try
        {
            var response = await client.SendAsync(httpRequestMessage);
            response.EnsureSuccessStatusCode(); // 主动抛出HTTP错误,便于排查问题
            var encoding = response.Content.Headers.ContentType?.CharSet != null 
                ? Encoding.GetEncoding(response.Content.Headers.ContentType.CharSet) 
                : Encoding.UTF8;
            var data = await response.Content.ReadAsStringAsync(encoding);
            return data;
        }
        catch
        {
            return "Please call the admin";
        }
    }
}

内容的提问来源于stack exchange,提问作者Pierre-Emmanuel giuglaris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 04:50:24