<PackageReference Include="System.Text.Encoding.CodePages" Version="9.0.0-preview.2.24128.5" />

CodePagesEncodingProvider

Provides access to an encoding provider for code pages that otherwise are available only in the desktop .NET Framework.
using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Threading; namespace System.Text { [System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] public sealed class CodePagesEncodingProvider : EncodingProvider { private static readonly EncodingProvider s_singleton = new CodePagesEncodingProvider(); private readonly Dictionary<int, Encoding> _encodings = new Dictionary<int, Encoding>(); private readonly 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 => 0; internal CodePagesEncodingProvider() { } [System.Runtime.CompilerServices.NullableContext(2)] 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); } [return: System.Runtime.CompilerServices.Nullable(2)] 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; if (codepage <= 51932) { switch (codepage) { case 10008: result = new DBCSCodePageEncoding(10008, 20936); goto IL_011a; case 10003: result = new DBCSCodePageEncoding(10003, 20949); goto IL_011a; case 50220: case 50221: case 50222: case 50225: break; case 50227: goto IL_00ea; case 51932: result = new EUCJPEncoding(); goto IL_011a; case 38598: result = new SBCSCodePageEncoding(codepage, 28598); goto IL_011a; default: goto IL_011a; } goto IL_00e1; } if (codepage <= 51949) { switch (codepage) { case 51936: break; case 51949: result = new DBCSCodePageEncoding(codepage, 20949); goto IL_011a; default: goto IL_011a; } goto IL_00ea; } switch (codepage) { case 54936: goto IL_00d9; case 52936: goto IL_00e1; } if ((uint)(codepage - 57002) <= 9) result = new ISCIIEncoding(codepage); goto IL_011a; IL_00e1: result = new ISO2022Encoding(codepage); goto IL_011a; IL_00ea: result = new DBCSCodePageEncoding(codepage, 936); goto IL_011a; IL_011a: return result; IL_00d9: result = new GB18030Encoding(); goto IL_011a; } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal unsafe static ref T GetNonNullPinnableReference<T>(T[] array) where T : struct { if (array.Length == 0) return ref Unsafe.AsRef<T>((void*)1); return ref array[0]; } } }