如何在C#和ASP.NET Core中将CSV文件编码为UTF-8格式
原有代码问题排查
你的两种实现都存在核心逻辑错误,所以没有生效:
- 误用
IFormFile.FileName:该属性是客户端上传的原始文件名,不是服务端本地存储的文件路径,直接用File类读写会找不到目标文件,IFormFile的内容需要通过OpenReadStream()方法获取流读取 - 第一种方法仅读取了文件第一行就写回,直接丢失了剩余所有内容;且无参构造的
StreamReader默认使用服务端系统编码读取文件,和文件原始编码不匹配,读取的内容本身就存在编码错误 - 第二种方法将可写的输出流本身作为内容写入,没有写入任何实际的文件内容,操作后文件内容无效
原生.NET实现方案
不需要第三方库即可完成转码,步骤如下:
- 首先安装NuGet包
System.Text.Encoding.CodePages,并在程序启动时注册编码提供器,支持识别各类非默认编码:
using System.Text; // 程序启动时执行一次即可,比如Program.cs的开头 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
- 完整转码实现:
using System.Text; // 1. 读取IFormFile的原始字节内容 byte[] originalFileBytes; using (var originalStream = file.OpenReadStream()) { using (var ms = new MemoryStream()) { originalStream.CopyTo(ms); originalFileBytes = ms.ToArray(); } } // 2. 指定原始文件的编码,拉丁字符集常用编码为ISO-8859-1,可根据实际场景替换 Encoding originalEncoding = Encoding.GetEncoding("ISO-8859-1"); // 原始字节按对应编码解码为字符串 string fileContent = originalEncoding.GetString(originalFileBytes); // 字符串编码为UTF8格式字节 byte[] utf8FileBytes = Encoding.UTF8.GetBytes(fileContent); // 3. 写入到服务端目标路径,或直接返回流供后续操作 File.WriteAllBytes("你的目标保存路径.csv", utf8FileBytes);
如果需要生成带BOM的UTF8文件,将最后一步的编码替换为new UTF8Encoding(true)即可。
第三方库实现方案
处理CSV文件推荐使用.NET生态常用的CsvHelper库,可自动处理CSV转义、编码转换等场景:
- 安装NuGet包
CsvHelper - 实现代码:
using CsvHelper; using System.Globalization; using System.Text; // 读取原始IFormFile内容 using var readStream = file.OpenReadStream(); // 替换为实际的原始文件编码 using var streamReader = new StreamReader(readStream, Encoding.GetEncoding("ISO-8859-1")); using var csvReader = new CsvReader(streamReader, CultureInfo.InvariantCulture); // 写入UTF8编码的CSV文件 using var writeStream = File.OpenWrite("目标保存路径.csv"); // UTF8Encoding构造参数为false表示不带BOM,设为true则带BOM using var streamWriter = new StreamWriter(writeStream, new UTF8Encoding(false)); using var csvWriter = new CsvWriter(streamWriter, CultureInfo.InvariantCulture); // 逐行读写保留所有CSV格式 while (csvReader.Read()) { csvWriter.WriteRecord(csvReader.Parser.Record); csvWriter.NextRecord(); }
内容的提问来源于stack exchange,提问作者Shishank Jain
相关产品推荐
相关产品推荐

