在.NET Core应用中如何指定INI配置文件的编码以正确读取内容?
解决Windows-1250编码INI文件的配置读取问题
没问题,这个场景我之前处理过,其实.AddIniFile方法本身就支持指定文件编码,只是默认没显式使用而已。不过有个关键细节要注意:.NET Core默认只包含UTF-8、UTF-16这类通用编码,像Windows-1250这种特定代码页的编码需要额外引入包来支持。
步骤1:安装编码支持包
首先需要安装System.Text.Encoding.CodePages NuGet包,它提供了各种Windows代码页的编码支持。可以用以下命令安装:
- 包管理器控制台:
Install-Package System.Text.Encoding.CodePages - .NET CLI:
dotnet add package System.Text.Encoding.CodePages
步骤2:注册编码提供器
在读取配置之前,需要先注册编码提供器,否则调用Encoding.GetEncoding(1250)会抛出找不到编码的异常。在Program.cs(或启动入口类)中添加以下代码:
using System.Text; // 注册编码提供器,必须在读取配置前执行 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
步骤3:指定编码读取INI文件
现在就可以用带encoding参数的AddIniFile重载方法来读取Windows-1250编码的配置文件了:
var configBuilder = new ConfigurationBuilder() // 最后一个参数指定编码为Windows-1250 .AddIniFile("appsettings.ini", optional: false, reloadOnChange: false, encoding: Encoding.GetEncoding(1250)); var configuration = configBuilder.Build(); // 现在读取带变音符号的配置值就不会乱码了 var mySpecialValue = configuration["SomeKeyWithDiacritics"];
备选方案:手动读取文件再加载
如果出于某些原因不想用重载方法,也可以手动读取文件内容,转换为UTF-8后通过流加载:
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); // 用Windows-1250编码读取文件内容 var iniContent = File.ReadAllText("appsettings.ini", Encoding.GetEncoding(1250)); // 转换为UTF-8字节流 using var stream = new MemoryStream(Encoding.UTF8.GetBytes(iniContent)); var configBuilder = new ConfigurationBuilder() .AddIniStream(stream); var configuration = configBuilder.Build();
这个方法本质是先把非UTF-8的文件内容转换成UTF-8流,再让配置系统读取,效果和直接指定编码是一样的,但不如第一种方法简洁。
内容的提问来源于stack exchange,提问作者Jan Palas
相关产品推荐
相关产品推荐

