当前位置: 首页 > news >正文

C# StreamWriter 指定编码写入文件完整教程

C# StreamWriter 指定编码写入文件完整教程

一、带编码的构造函数重载

StreamWriter 有专门接收 Encoding 的构造器,格式:

public StreamWriter(string path, bool append, Encoding encoding);
// 进阶:自定义缓冲区大小
public StreamWriter(string path, bool append, Encoding encoding, int bufferSize);

参数说明:

  1. path:文件路径
  2. appendtrue 追加,false 覆盖原文件
  3. encoding:字符编码(UTF8、GB2312、GBK、Unicode 等)

不写编码参数时,StreamWriter 默认使用 UTF-8 带 BOM

二、常用编码示例

1. UTF-8(无BOM,推荐互联网通用)

.NET 内置 Encoding.UTF8 是带BOM的;无BOM需要手动创建:

using System;
using System.IO;
using System.Text;// UTF8 无BOM
Encoding utf8NoBom = new UTF8Encoding(false);string path = "utf8_nobom.txt";
using (StreamWriter sw = new StreamWriter(path, false, utf8NoBom))
{sw.WriteLine("测试中文 UTF8无BOM");sw.WriteLine("123abc测试");
}

2. UTF-8 默认带BOM

using (StreamWriter sw = new StreamWriter("utf8_bom.txt", false, Encoding.UTF8))
{sw.WriteLine("UTF8带BOM,记事本打开不乱码");
}

3. GB2312 / GBK(老Windows、记事本兼容)

注意:.NET Core/.NET 5+ 需要注册编码提供程序

// 程序入口先执行一次,否则GetEncoding("GB2312")报错
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);// GB2312
Encoding gbk = Encoding.GetEncoding("GB2312");using (StreamWriter sw = new StreamWriter("gb2312.txt", false, gbk))
{sw.WriteLine("中文GB2312编码");
}

4. Unicode(UTF-16 LE)

using (StreamWriter sw = new StreamWriter("unicode.txt", false, Encoding.Unicode))
{sw.WriteLine("Unicode UTF16编码");
}

三、追加写入 + 指定编码

第二个参数传 true 表示在文件末尾追加内容:

Encoding utf8NoBom = new UTF8Encoding(false);
string logPath = "log.txt";// append = true 追加
using (StreamWriter sw = new StreamWriter(logPath, true, utf8NoBom))
{sw.WriteLine($"{DateTime.Now} 追加一行日志");
}

四、配合 FileStream 底层指定编码(高级用法)

先创建文件流,再传入 StreamWriter 构造:

string path = "stream_enc.txt";
Encoding enc = Encoding.UTF8;using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write))
using (StreamWriter sw = new StreamWriter(fs, enc))
{sw.WriteLine("通过FileStream指定编码");
}

五、异步写入并指定编码

static async Task WriteEncodeAsync()
{Encoding utf8NoBom = new UTF8Encoding(false);string path = "async_utf8.txt";using (StreamWriter sw = new StreamWriter(path, false, utf8NoBom)){await sw.WriteLineAsync("异步写入,指定UTF8无BOM");await sw.FlushAsync();}
}

六、常见问题

  1. GB2312 报错:不支持该编码
    .NET Core/.NET5+ 缺少码表提供程序,在 Program.Main 第一行添加:
    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
    
  2. 中文打开乱码
    • 记事本打开乱码:改用 UTF8带BOM Encoding.UTF8
    • 网页/后端读取乱码:使用 UTF8无BOM new UTF8Encoding(false)
  3. 忘记 using 导致文件锁定
    StreamWriter 实现 IDisposable,必须包裹 using,自动关闭释放流。

七、最简模板

// 覆盖写入,UTF8无BOM
var enc = new UTF8Encoding(false);
using var sw = new StreamWriter("test.txt", false, enc);
sw.WriteLine("内容");
// 追加写入,GB2312
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var enc = Encoding.GetEncoding("GB2312");
using var sw = new StreamWriter("log.txt", true, enc);
sw.WriteLine("追加日志");
http://www.jsqmd.com/news/1044397/

相关文章:

  • 梯度裁剪:G-Crop革新小样本图像分类
  • 新乡市 2026 家长必存!5 所权威青少年厌学戒网瘾行为矫正学校完整介绍 - 辛云教育资讯
  • 吴恩达《深度学习》之看懂 YOLO 目标检测的“鹰眼”直觉
  • 精选10所|2026南京市十大叛逆青少年戒网瘾封闭式管教学校名单,解家长焦虑,助少年归正 - 辛云教育资讯
  • 深耕杭城防水领域 匠心守护安居|微顺虹防水:初心筑品质,服务护万家 - 徽顺虹
  • MPC555/556中断处理与代码压缩技术深度解析
  • 深入解析MCF5206嵌入式SoC:指令缓存与系统集成模块实战配置
  • 水下机器人航向与深度双路智能PID控制Python代码包
  • 2026 咸阳防水补漏靠谱服务商盘点:屋面 / 厨卫 / 外墙 / 地下室渗水维修详解,适配关中平原温差干冷防水甄选指南 - 宅安选房屋修缮
  • 6/18
  • Playwright MCP:AI驱动UI自动化测试的新范式与实践
  • SecKill——从零到一:手把手教你打造Python自动化抢单神器
  • 10分钟搞定黑苹果:OpCore-Simplify让OpenCore配置变得前所未有的简单
  • 显存不够用怎么办,vLLM 在 Instinct GPU 上的优化策略
  • Windows微信QQ防撤回实战:二进制补丁技术原理与RevokeMsgPatcher工具详解
  • MPC5554电气特性与接口时序深度解析:从数据手册到可靠硬件设计
  • 2026年全球高标准流体项目选型指南:主流自控阀门厂家技术盘点与多维工况实测 - 热点观察
  • 6,9
  • 3步诊断方案:彻底解决华硕笔记本风扇异常问题
  • 深入解析BDLC控制器:J1850总线非破坏性仲裁机制与汽车电子通信实践
  • IEMOCAP多模态情感识别TensorFlow实现:文本+语音+图像联合建模,支持4类细粒度情绪分类
  • 普宁性价比高的家具推荐|线上线下同价不溢价吗 - 品牌观察
  • 【2025年6月】大流量潜水泵厂家推荐指南 - 多才菠萝
  • SuperCom串口调试工具:如何用一款工具解决嵌入式开发中的5大串口调试痛点?
  • 2026 镇江防水补漏靠谱服务商盘点:屋面 / 厨卫 / 外墙 / 地下室渗水维修详解,适配苏南长江沿岸梅雨潮湿防水甄选指南 - 宅安选房屋修缮
  • Go学习第11天:包管理 + VSCode开发
  • 普宁实木家具推荐|原木胡桃木哪家风格齐 - 品牌观察
  • 学习总结6
  • 2026年,市场专业AI搜索企业名声几何?
  • 深入解析MC9S12XE Flash安全访问与内存管理实战指南