Laden...

UTF8/ASCII in INI

Erstellt von vnvjan vor einem Jahr Letzter Beitrag vor einem Jahr 241 Views
V
vnvjan Themenstarter:in
74 Beiträge seit 2006
vor einem Jahr
UTF8/ASCII in INI

In meiner INI Klasse lese ich mit folgendem Code eine ganze Sektion aus. Die INI ist mit UTF8/BOM gespeichert. Nun will ich in diese Daten in der GUI visualisieren, bekomme aber in allen Fällen mit Sonderzeichen falsche Zeichen in Controls zurückgegeben. So richtig weiß ich mir grad keinen Rat.


        public string[] ReadSectionRAW(string strSectionName)
        {
            IntPtr pBuffer = Marshal.AllocHGlobal(1048576);
            string[] strArray = new string[0];
            UInt32 uiNumCharCopied = 0;

            uiNumCharCopied = GetPrivateProfileSection(strSectionName, pBuffer, 1048576, FFILE);

            int iStartAddress = pBuffer.ToInt32();
            int iEndAddress = iStartAddress + (int)uiNumCharCopied;

            while (iStartAddress < iEndAddress)
            {
                int iArrayCurrentSize = strArray.Length;
                Array.Resize<string>(ref strArray, iArrayCurrentSize + 1);

                string strCurrent = Marshal.PtrToStringAnsi(new IntPtr(iStartAddress));

                if (fileEncoding == Encoding.UTF8)
                {
                    Encoding enc = new UTF8Encoding(true);

                    byte[] utf8bytes = enc.GetBytes(strCurrent);
                    byte[] win1252Bytes = Encoding.Convert(enc, Encoding.ASCII, utf8bytes);

                    strCurrent = Encoding.ASCII.GetString(win1252Bytes);
                }

                strArray[iArrayCurrentSize] = strCurrent;
                iStartAddress += (strCurrent.Length + 1);
            }

            Marshal.FreeHGlobal(pBuffer);
            pBuffer = IntPtr.Zero;

            return strArray;
        }

2.080 Beiträge seit 2012
vor einem Jahr

string strCurrent = Marshal.PtrToStringAnsi(new IntPtr(iStartAddress));

if (fileEncoding == Encoding.UTF8)
{
    Encoding enc = new UTF8Encoding(true);

    byte[] utf8bytes = enc.GetBytes(strCurrent);
    byte[] win1252Bytes = Encoding.Convert(enc, Encoding.ASCII, utf8bytes);

    strCurrent = Encoding.ASCII.GetString(win1252Bytes);
}

Was genau ist der Sinn hinter diesem Code?
Du hast UTF16, holst per UTF8-BOM die Bytes, konvertierst sie in ASCII und holst von den ASCII-Bytes den dann ASCII-String?
Das klingt ziemlich unsinnig 😉

Und was der Code drum herum soll, ist mir auch nicht ganz klar

By the way:
Zum Lesen von INI gibt's Frameworks.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

16.841 Beiträge seit 2008
vor einem Jahr

NuGet ini Packages ini