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

1次阅读

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

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

直接用 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 文件常用 rn,而 .NET 的 WriteAllText 在不同平台可能标准化为本地换行符。若需严格保留原换行风格,应改用 File.WriteAllBytes + 手动编码转换字节,而不是走字符串中转。

遇到“不支持的编码名称”错误怎么办

这个错误通常出现在 .NET Core / .NET 5+ 的最小化部署中。解决方法只有两个:

  • 添加 NuGet 包:System.Text.Encoding.CodePages
  • 在程序启动处(如 Main 方法开头)加一行:Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)

漏掉注册会导致 Encoding.GetEncoding("GB2312") 直接抛异常,且不会提示你缺包——它只会说“不支持的编码名称”。

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

text=ZqhQzanResources