C#文件内容编码转换 C#如何将文件从GB2312转换为UTF-8

来源:这里教程网 时间:2026-02-21 17:42:32 作者:

直接用
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")
直接抛异常,且不会提示你缺包——它只会说“不支持的编码名称”。

实际转换中最容易被忽略的是环境编码支持前提,而不是转换逻辑本身。

相关推荐