<PackageReference Include="System.Text.Encoding.CodePages" Version="4.6.0" />

CodePagesEncodingProvider

using System.Collections.Generic; using System.Threading; namespace System.Text { public sealed class CodePagesEncodingProvider : EncodingProvider { private static readonly EncodingProvider s_singleton = new CodePagesEncodingProvider(); private Dictionary<int, Encoding> _encodings = new Dictionary<int, Encoding>(); private ReaderWriterLockSlim _cacheLock = new ReaderWriterLockSlim(); private const int ISCIIAssemese = 57006; private const int ISCIIBengali = 57003; private const int ISCIIDevanagari = 57002; private const int ISCIIGujarathi = 57010; private const int ISCIIKannada = 57008; private const int ISCIIMalayalam = 57009; private const int ISCIIOriya = 57007; private const int ISCIIPanjabi = 57011; private const int ISCIITamil = 57004; private const int ISCIITelugu = 57005; private const int ISOKorean = 50225; private const int ChineseHZ = 52936; private const int ISO2022JP = 50220; private const int ISO2022JPESC = 50221; private const int ISO2022JPSISO = 50222; private const int ISOSimplifiedCN = 50227; private const int EUCJP = 51932; private const int CodePageMacGB2312 = 10008; private const int CodePageMacKorean = 10003; private const int CodePageGB2312 = 20936; private const int CodePageDLLKorean = 20949; private const int GB18030 = 54936; private const int DuplicateEUCCN = 51936; private const int EUCKR = 51949; private const int EUCCN = 936; private const int ISO_8859_8I = 38598; private const int ISO_8859_8_Visual = 28598; public static EncodingProvider Instance => s_singleton; private static int SystemDefaultCodePage { get { if (!global::Interop.mincore.TryGetACPCodePage(out int codePage)) return 0; return codePage; } } internal CodePagesEncodingProvider() { } public override Encoding GetEncoding(int codepage) { if (codepage < 0 || codepage > 65535) return null; if (codepage != 0) { Encoding value = null; _cacheLock.EnterUpgradeableReadLock(); try { if (!_encodings.TryGetValue(codepage, out value)) { switch (BaseCodePageEncoding.GetCodePageByteSize(codepage)) { case 1: value = new SBCSCodePageEncoding(codepage); break; case 2: value = new DBCSCodePageEncoding(codepage); break; default: value = GetEncodingRare(codepage); if (value == null) return null; break; } _cacheLock.EnterWriteLock(); try { if (!_encodings.TryGetValue(codepage, out Encoding value2)) { _encodings.Add(codepage, value); return value; } return value2; } finally { _cacheLock.ExitWriteLock(); } } return value; } finally { _cacheLock.ExitUpgradeableReadLock(); } } int systemDefaultCodePage = SystemDefaultCodePage; if (systemDefaultCodePage == 0) return null; return GetEncoding(systemDefaultCodePage); } public override Encoding GetEncoding(string name) { int codePageFromName = System.Text.EncodingTable.GetCodePageFromName(name); if (codePageFromName == 0) return null; return GetEncoding(codePageFromName); } private static Encoding GetEncodingRare(int codepage) { Encoding result = null; switch (codepage) { case 57002: case 57003: case 57004: case 57005: case 57006: case 57007: case 57008: case 57009: case 57010: case 57011: result = new ISCIIEncoding(codepage); break; case 10008: result = new DBCSCodePageEncoding(10008, 20936); break; case 10003: result = new DBCSCodePageEncoding(10003, 20949); break; case 54936: result = new GB18030Encoding(); break; case 50220: case 50221: case 50222: case 50225: case 52936: result = new ISO2022Encoding(codepage); break; case 50227: case 51936: result = new DBCSCodePageEncoding(codepage, 936); break; case 51932: result = new EUCJPEncoding(); break; case 51949: result = new DBCSCodePageEncoding(codepage, 20949); break; case 38598: result = new SBCSCodePageEncoding(codepage, 28598); break; } return result; } } }