C#处理CSV文件乱码 C#读取CSV时如何正确处理各种编码问题

5次阅读

csv中文乱码主因是编码不匹配,应通过检测文件头bom(如ef bb bf为utf-8 with bom)确定真实编码,再用streamreader显式指定encoding读取;写入时按需选择utf-8 with bom(兼容excel)或without bom(跨平台),避免依赖默认编码。

C#处理CSV文件乱码 C#读取CSV时如何正确处理各种编码问题

csv文件读取时出现中文乱码,大概率是编码没对上

windows记事本默认用UTF-8 with BOMGBK(取决于系统区域),而File.ReadAllTextStreamReader不显式指定编码时会 fallback 到UTF-8(无BOM)或系统默认编码,两者错位就直接显示“”或方块。别猜,先查BOM。

如何检测CSV真实编码(尤其带BOM的UTF-8/UTF-16)

靠文件头4字节就能判断,比依赖扩展名或用户声明可靠得多:

  • EF BB BFUTF-8 with BOM
  • FF FEUTF-16 LE
  • FE FFUTF-16 BE
  • 前两字节是00 00且第三字节非00 → 很可能是UTF-32
  • 其余情况,默认按GBK(中文Windows常见)或UTF-8尝试(建议优先试GBK

实操建议:封装一个DetectEncoding方法,读取文件前4字节,返回Encoding实例,再传给StreamReader。别硬写new StreamReader(path)

StreamReader读CSV时必须传入明确Encoding

File.ReadAllLinesFile.ReadAllText没有编码参数重载(.NET Core 6+才有),容易踩坑。稳妥做法是始终用StreamReader

using var sr = new StreamReader(filePath, detectedEncoding); string line; while ((line = sr.ReadLine()) != NULL) {     // 按,分割、处理引号转义等... }

注意:detectedEncoding不能为null;若检测失败,至少 fallback 到Encoding.GetEncoding("GBK")(中文Windows环境)或Encoding.UTF8,别让程序抛DecoderFallbackException

写CSV时也要主动指定编码,避免下次读又乱

StreamWriter写入时,不传Encoding参数会默认用UTF-8 without BOM,但Excel打开可能仍乱码——因为Excel(尤其是旧版)默认按系统编码解析,不识别UTF-8 BOM。解决办法:

  • 要兼容Excel双击打开 → 写成UTF-8 with BOMnew StreamWriter(path, false, new UTF8Encoding(true))
  • 要确保linux/macos脚本可读 → 用UTF-8 without BOM,但需配套文档说明编码
  • 内部系统间传输 → 统一用UTF-8 with BOM最省事

BOM不是装饰,它是编码的“身份证”。漏掉它,等于把文件扔进编码迷宫里。

text=ZqhQzanResources