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

使用C#向Azure Blob Storage上传/下载CSV时的字符编码异常问题

C#向Azure Blob Storage上传/下载CSV时的字符编码异常问题

看起来你碰到了很常见的编码不匹配坑——上传时明明处理了特殊字符,用Azure Storage Explorer直接查看也正常,但自己的C#服务下载后,法语、德语字符就变成了�。核心问题要么是下载时没指定正确编码读取,要么是上传时没给Blob设置明确的编码头,导致解析时搞错了字符格式。咱们一步步来解决:

先捋清楚问题根源

你上传时用了Encoding.UTF8.GetBytes转字节,但要注意:StringWriter默认用的是UTF-16编码,从它拿到字符串再转UTF-8,中间多了一次编码转换,容易埋下隐患。另外,即使Blob的ContentType显示正确,如果没明确设置ContentEncoding为utf-8,下载时系统可能会用默认编码(比如ASCII)去解析,自然就把多字节的特殊字符拆坏了。

上传代码优化

建议直接用StreamWriter写入内存流,全程用UTF-8编码,同时上传时给Blob设置正确的HTTP头,让Azure明确知道这是UTF-8编码的CSV:

public async Task CreateCSV<T>(string reference, IEnumerable<T> data)
{
    using (var stream = new MemoryStream())
    // 直接用UTF-8编码的StreamWriter,避免中间转码
    using (var writer = new StreamWriter(stream, Encoding.UTF8, leaveOpen: true))
    using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
    {
        csv.WriteRecords(data);
        await writer.FlushAsync(); // 确保所有数据写入流
        stream.Position = 0; // 重置流指针到开头
        await SaveToBlobStorage(reference, stream);
    }
}

// 调整SaveToBlobStorage方法,添加编码和内容类型设置
private async Task SaveToBlobStorage(string reference, Stream stream)
{
    var blobClient = _blobContainerClient.GetBlobClient(reference);
    var blobHeaders = new BlobHttpHeaders
    {
        ContentType = "text/csv; charset=utf-8",
        ContentEncoding = "utf-8" // 明确标记编码
    };
    await blobClient.UploadAsync(stream, blobHeaders);
}

下载代码修正

下载时一定要用UTF-8编码读取流,不能依赖系统默认编码(默认编码会随系统变化,比如中文系统是GB2312)。试试这样改你的下载逻辑:

public async Task<string> DownloadCSV(string reference)
{
    var blobClient = _blobContainerClient.GetBlobClient(reference);
    using (var stream = new MemoryStream())
    {
        await blobClient.DownloadToAsync(stream);
        stream.Position = 0;
        // 用UTF-8的StreamReader读取内容
        using (var reader = new StreamReader(stream, Encoding.UTF8))
        {
            return await reader.ReadToEndAsync();
        }
    }
}

验证步骤

上传完成后,去Azure Storage Explorer里检查Blob的属性:

  • 确认Content-Type是text/csv; charset=utf-8
  • 确认Content-Encoding是utf-8

这样不管是Storage Explorer还是你的C#服务下载,都会用正确的UTF-8编码解析内容,特殊字符就不会变成乱码了。

备注:内容来源于stack exchange,提问作者Tree Frog

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 13:43:03