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

