使用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
相关产品推荐
相关产品推荐

