# 编码处理
Apq.Cfg 提供强大的文件编码检测和处理能力。
默认情况下,Apq.Cfg 会自动检测文件编码:
var cfg = new CfgBuilder()
.AddJsonFile("config.json") // 自动检测编码
.Build();
| 编码 | BOM 检测 | 内容检测 |
|---|---|---|
| UTF-8 | ✅ | ✅ |
| UTF-8 (无 BOM) | - | ✅ |
| UTF-16 LE | ✅ | ✅ |
| UTF-16 BE | ✅ | ✅ |
| UTF-32 LE | ✅ | - |
| UTF-32 BE | ✅ | - |
| GB2312/GBK | - | ✅ |
| Big5 | - | ✅ |
| ISO-8859-1 | - | ✅ |
var cfg = new CfgBuilder()
.AddJsonFile("config.json", encoding: Encoding.UTF8)
.AddYamlFile("config.yaml", encoding: Encoding.GetEncoding("GBK"))
.Build();
var cfg = new CfgBuilder()
.AddJsonFile("config.json", encodingOptions: new EncodingOptions
{
DefaultEncoding = Encoding.UTF8,
DetectEncodingFromByteOrderMarks = true,
FallbackEncoding = Encoding.GetEncoding("GBK")
})
.Build();
为不同文件配置不同的编码:
var cfg = new CfgBuilder()
.ConfigureEncoding(options =>
{
// 按文件扩展名映射
options.AddMapping(".json", Encoding.UTF8);
options.AddMapping(".yaml", Encoding.UTF8);
options.AddMapping(".ini", Encoding.GetEncoding("GBK"));
// 按文件名映射
options.AddMapping("legacy-config.xml", Encoding.GetEncoding("GB2312"));
})
.AddJsonFile("config.json")
.AddIniFile("settings.ini")
.Build();
获取检测到的编码信息:
var source = new JsonFileCfgSource("config.json");
var result = source.DetectEncoding();
Console.WriteLine($"检测到的编码: {result.Encoding.EncodingName}");
Console.WriteLine($"检测方法: {result.DetectionMethod}");
Console.WriteLine($"置信度: {result.Confidence}");
| 方法 | 说明 |
|---|---|
BOM |
通过字节顺序标记检测 |
Content |
通过内容分析检测 |
Default |
使用默认编码 |
Specified |
用户指定编码 |
var cfg = new CfgBuilder()
.ConfigureEncoding(options =>
{
options.OnDecodingError = DecodingErrorAction.Replace;
options.ReplacementChar = '?';
})
.AddJsonFile("config.json")
.Build();
| 选项 | 说明 |
|---|---|
Throw |
抛出异常(默认) |
Replace |
用替换字符替代 |
Skip |
跳过无效字符 |
推荐所有配置文件使用 UTF-8 编码:
var cfg = new CfgBuilder()
.ConfigureEncoding(options =>
{
options.DefaultEncoding = Encoding.UTF8;
})
.AddJsonFile("config.json")
.Build();
对于遗留系统的配置文件:
var cfg = new CfgBuilder()
.ConfigureEncoding(options =>
{
// 遗留 INI 文件使用 GBK
options.AddMapping("*.ini", Encoding.GetEncoding("GBK"));
// 新文件使用 UTF-8
options.DefaultEncoding = Encoding.UTF8;
})
.Build();
写入配置时保持原有编码:
// 读取时记录编码
var detectedEncoding = source.DetectEncoding().Encoding;
// 写入时使用相同编码
File.WriteAllText("config.json", content, detectedEncoding);