必须显式指定源编码,用encoding.getencoding("gb2312")解码字节再转utf-8写入;若报“不支持的编码名称”,需引用system.text.encoding.codepages并调用encoding.registerprovider(codepagesencodingprovider.instance)。

直接用 File.ReadAllText + File.WriteAllText 会出错
很多人第一反应是读出来再写回去,但这样默认用系统默认编码(通常是 UTF-8),而 GB2312 编码的文件如果被误当 UTF-8 解码,ReadAllText 就会抛 ArgumentException 或产生乱码。关键不是“怎么读”,而是“必须显式指定源编码”。
正确做法:用 Encoding.GetEncoding("GB2312") 显式解码
GB2312 是 Windows 下常见但非 .NET 内置默认编码,需手动获取编码对象。注意:Encoding.GetEncoding("GB2312") 在 .NET Core 3.0+ 和 .NET 5+ 中默认可用;若在精简版运行时(如某些 Unity 环境)报错,需确保已引用 System.Text.Encoding.CodePages 并调用 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)。
实操步骤:
- 先用
File.ReadAllBytes(path)读取原始字节,避免任何自动解码干扰 - 用
Encoding.GetEncoding("GB2312").GetString(bytes)转成字符串(这步完成 GB2312 → Unicode) - 再用
File.WriteAllText(path, content, Encoding.UTF8)写入,明确指定 UTF-8 输出
示例代码片段:
var bytes = File.ReadAllBytes("input.txt");
var gb2312 = Encoding.GetEncoding("GB2312");
string content = gb2312.GetString(bytes);
File.WriteAllText("output.txt", content, Encoding.UTF8);
批量转换时要注意 BOM 和换行符一致性
UTF-8 文件是否带 BOM 是个隐形坑:Encoding.UTF8 默认不写 BOM,但有些旧工具(如 Excel)依赖 BOM 才能正确识别 UTF-8。如需带 BOM,改用 new UTF8Encoding(true) 作为第三个参数。
另外,GB2312 文件常用 \r\n,而 .NET 的 WriteAllText 在不同平台可能标准化为本地换行符。若需严格保留原换行风格,应改用 File.WriteAllBytes + 手动编码转换字节,而不是走字符串中转。
遇到“不支持的编码名称”错误怎么办
这个错误通常出现在 .NET Core / .NET 5+ 的最小化部署中。解决方法只有两个:
- 添加 NuGet 包:
System.Text.Encoding.CodePages - 在程序启动处(如
Main方法开头)加一行:Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)
漏掉注册会导致 Encoding.GetEncoding("GB2312") 直接抛异常,且不会提示你缺包——它只会说“不支持的编码名称”。










