Ubuntu 16.04下Mono运行C#调用windows-1251编码报错求助
在Ubuntu 16.04的Mono环境中,默认不会包含所有非通用编码的支持(比如windows-1251),这就是你调用Encoding.GetEncoding(1251)抛出NotSupportedException的原因。下面分两种场景给你具体的解决方案:
场景1:使用.NET Core/.NET 5+或基于NuGet的项目
如果你的项目是用现代.NET SDK构建的(哪怕是在Mono上运行),最可靠的方式是通过NuGet引入System.Text.Encoding.CodePages程序集:
安装NuGet包
打开终端,进入你的项目目录,执行以下命令:dotnet add package System.Text.Encoding.CodePages如果你用的是IDE(比如Rider、VS Code),也可以直接在NuGet包管理器中搜索
System.Text.Encoding.CodePages并安装。在代码中注册编码提供者
在你调用Encoding.GetEncoding之前,必须先注册编码提供者,记得引入System.Text命名空间:using System.Text; // 注册编码提供者(必须放在获取编码之前) Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); // 现在可以正常获取windows-1251编码了 var win1251 = Encoding.GetEncoding(1251);
场景2:传统.NET Framework/Mono项目(无NuGet依赖)
如果你的项目是基于旧版Mono框架(比如.NET Framework 4.x),可以直接安装系统层面的Mono编码扩展包来解决:
在终端执行以下命令安装额外的编码支持:
sudo apt update sudo apt install mono-locale-extras
安装完成后,重启你的应用,一般不需要修改代码就可以直接调用Encoding.GetEncoding("windows-1251")了。
验证示例代码
这里给你一个完整的测试代码,确保功能正常:
using System; using System.Text; class EncodingTest { static void Main() { // 针对NuGet场景的注册步骤(传统Mono场景可跳过) Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); try { var encoding = Encoding.GetEncoding("windows-1251"); Console.WriteLine($"成功加载编码:{encoding.WebName}"); // 测试俄文转码 string original = "Привет, мир!"; byte[] encodedBytes = encoding.GetBytes(original); string decoded = encoding.GetString(encodedBytes); Console.WriteLine($"原字符串:{original}"); Console.WriteLine($"解码后:{decoded}"); } catch (Exception ex) { Console.WriteLine($"出错了:{ex.Message}"); } } }
为什么之前找不到RegisterProvider?
Encoding.RegisterProvider方法和CodePagesEncodingProvider类都属于System.Text.Encoding.CodePages程序集,这个程序集不会被默认引用,所以必须通过NuGet安装或者系统包的方式添加进来,才能在代码中访问到这些类型和方法。
内容的提问来源于stack exchange,提问作者袗谢械泻褋邪薪写褉 小械褉谐械械胁懈褔 袛卸褍褋

