- Guarantee deterministic encoding/decoding for dBASE III+/IV DBF/DBT assets across Windows, Linux, and macOS.
- Provide a self-describing registry that maps legacy DOS/OEM code pages to .NET
System.Text.Encodinginstances. - Allow per-table overrides sourced from DBF headers, sidecar
.cpgfiles, configuration, or runtime options.
- Builtin Catalog — JSON manifest embedded in
XBase.Coreexposes canonical IDs (e.g.,cp437,cp850,windows-1252) with metadata:- Display name and description.
- Preferred .NET encoding name.
- OEM/ANSI flag to distinguish header semantics.
- Normalized culture hints.
- Resolution Flow — When opening a table:
- Inspect DBF header language driver byte.
- Consult adjacent
.cpgfile when present. - Apply provider-level override from connection string (
Encoding=...) or EF Core options. - Fall back to repository default (
cp437).
- Extensibility — Providers call
EncodingRegistry.TryRegister(customEncoding)to register new mappings. Collisions require an explicitoverride: trueflag to avoid accidental shadowing.
| Scenario | Expected Behavior | Test Coverage |
|---|---|---|
| Header byte recognized | Registry returns deterministic EncodingInfo |
EncodingRegistryTests.HeaderByte_Recognized_ReturnsEntry |
.cpg overrides header |
.cpg wins with warning log |
EncodingRegistryTests.CpgOverridesHeader_EmitsWarning |
| Unknown encoding | Throws UnsupportedEncodingException with guidance |
EncodingRegistryTests.UnknownEncoding_Throws |
| Provider override | ADO.NET + EF Core accept Encoding= keyword |
Integration tests in XBase.Data.Tests + XBase.EFCore.Tests |
- CLI —
xbase dbfinforeports detected encoding, mismatches, and override suggestions. - Configuration —
appsettings.jsonschema supports"xBase": { "defaultEncoding": "cp437" }for hosting scenarios. - Monitoring — Emit structured log
EncodingMismatchwhen runtime overrides diverge from headers for audit trails.
- Expand registry with FoxPro-specific code pages (e.g.,
windows-1251,koi8-r). - Allow per-column encoding overrides for memo vs. table character fields when FPT uses differing code pages.
End of CODEPAGES.md