internal static unsafe EncodingInfo [] GetEncodings(CodePagesEncodingProvider provider)
{
lock (s_streamLock)
{
s_codePagesEncodingDataStream.Seek(CODEPAGE_DATA_FILE_HEADER_SIZE, SeekOrigin.Begin);
int codePagesCount;
fixed(byte *pBytes = &s_codePagesDataHeader[0])
{
CodePageDataFileHeader *pDataHeader = (CodePageDataFileHeader *)pBytes;
codePagesCount = pDataHeader->CodePageCount;
}
EncodingInfo [] encodingInfoList = new EncodingInfo[codePagesCount];
CodePageIndex codePageIndex = default;
Span <byte> pCodePageIndex = new Span <byte>(&codePageIndex, Unsafe.SizeOf <CodePageIndex>());
for (int i = 0; i < codePagesCount; i++)
{
s_codePagesEncodingDataStream.Read(pCodePageIndex);
string codePageName;
switch (codePageIndex.CodePage)
{
// Fixup some encoding names.
case 950: codePageName = "big5"; break;
case 10002: codePageName = "x-mac-chinesetrad"; break;
case 20833: codePageName = "x-ebcdic-koreanextended"; break;
default: codePageName = new string(&codePageIndex.CodePageName); break;
}
string?resourceName = EncodingNLS.GetLocalizedEncodingNameResource(codePageIndex.CodePage);
string?displayName = null;
if (resourceName != null && resourceName.StartsWith("Globalization_cp_", StringComparison.OrdinalIgnoreCase))
{
displayName = SR.GetResourceString(resourceName);
}
encodingInfoList[i] = new EncodingInfo(provider, codePageIndex.CodePage, codePageName, displayName ?? codePageName);
}
return(encodingInfoList);
}
}