直接用 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") 直接抛异常,且不会提示你缺包——它只会说“不支持的编码名称”。
实际转换中最容易被忽略的是环境编码支持前提,而不是转换逻辑本身。 