You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 16.04下Mono运行C#调用windows-1251编码报错求助

解决Mono下无法使用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程序集:

  1. 安装NuGet包
    打开终端,进入你的项目目录,执行以下命令:

    dotnet add package System.Text.Encoding.CodePages
    

    如果你用的是IDE(比如Rider、VS Code),也可以直接在NuGet包管理器中搜索System.Text.Encoding.CodePages并安装。

  2. 在代码中注册编码提供者
    在你调用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,提问作者袗谢械泻褋邪薪写褉 小械褉谐械械胁懈褔 袛卸褍褋

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:06:36