.NET Core 应用程序配置:指定 INI 文件编码
.NET Core app configuration: Specify INI file encoding
在我的应用程序启动期间,我从 INI 文件中读取配置值:
configBuilder.AddIniFile("appsettings.ini");
但是,appsettings.ini
的编码不同于 UTF-8(在我的例子中是 Windows-1250)。因此,所有包含变音符号的配置值都存在问题。
有没有办法指定配置文件的编码,以便正确读取所有配置值?
(在我的情况下无法更改 appsettings.ini
的编码。)
使用 StreamReader 可能会有所帮助,因为您可以在读取文件时指定编码。有不同的编码可供选择(UTF8、Unicode 等)。下面的 .NET Core 控制台应用程序示例:
using System;
using System.IO;
using System.Text;
namespace ConsoleDiacritic
{
public class Program
{
static void Main(string[] args)
{
ReadFile();
}
private static void ReadFile()
{
string sourceFile = @"c:\temp\appsettings.ini";
using (var filestream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, useAsync: true))
{
using var streamReader = new StreamReader(filestream, Encoding.UTF8);
string lines = streamReader.ReadToEnd();
Console.WriteLine(lines);
}
}
}
}
这是适合我的方法
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var configText = File.ReadAllText("config2.ini", Encoding.GetEncoding("windows-1250"));
var ms = new MemoryStream();
ms.Write(Encoding.Default.GetBytes(configText));
ms.Position = 0;
IConfiguration config = new ConfigurationBuilder()
.AddIniStream(ms)
.Build();
ms.Dispose();
在我的应用程序启动期间,我从 INI 文件中读取配置值:
configBuilder.AddIniFile("appsettings.ini");
但是,appsettings.ini
的编码不同于 UTF-8(在我的例子中是 Windows-1250)。因此,所有包含变音符号的配置值都存在问题。
有没有办法指定配置文件的编码,以便正确读取所有配置值?
(在我的情况下无法更改 appsettings.ini
的编码。)
使用 StreamReader 可能会有所帮助,因为您可以在读取文件时指定编码。有不同的编码可供选择(UTF8、Unicode 等)。下面的 .NET Core 控制台应用程序示例:
using System;
using System.IO;
using System.Text;
namespace ConsoleDiacritic
{
public class Program
{
static void Main(string[] args)
{
ReadFile();
}
private static void ReadFile()
{
string sourceFile = @"c:\temp\appsettings.ini";
using (var filestream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, useAsync: true))
{
using var streamReader = new StreamReader(filestream, Encoding.UTF8);
string lines = streamReader.ReadToEnd();
Console.WriteLine(lines);
}
}
}
}
这是适合我的方法
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var configText = File.ReadAllText("config2.ini", Encoding.GetEncoding("windows-1250"));
var ms = new MemoryStream();
ms.Write(Encoding.Default.GetBytes(configText));
ms.Position = 0;
IConfiguration config = new ConfigurationBuilder()
.AddIniStream(ms)
.Build();
ms.Dispose();