Avatar billede md_craig Nybegynder
27. oktober 2006 - 16:09 Der er 7 kommentarer og
1 løsning

Implementere egene Tegnsæt (Encoding)

Jeg leder lige efter nogle gode artikler på overstående emne...

En ting er at komme i gang med det, men det skal også gøres korrekt hels... derfor vil jeg gerne hører om nogen lige ligger inde med links på det...

Eller hvis man selv har arbejdet med det før er den form for indput også gode...
Avatar billede driis Nybegynder
27. oktober 2006 - 17:24 #1
Tegnsæt i .NET er implementeret ved basisklassen System.Text.Encoding, som så har sine implementationer, ASCIIEncoding, UTF8Encoding, etc.
http://msdn2.microsoft.com/en-us/library/system.text.encoding.aspx

Hvis du vil lave din egen encoding, laver du blot en klasse, der arver fra Encoding (eller, for at gøre det nemt for dig selv, arver fra en encoding, der måske ligner den du vil implementere - det kan du selv vurdere).

Hvis du arver fra en eksisterende Encoding klasse, kan du nemt bestemme selve translationen fra chars til bytes, ved at overskrive hhv. GetEncoder og GetDecoder og lade dem returnere dit eget specielle Encoder eller Decoder objekt.

Et eksempel: Hvis du vil lave en encoding, der inverterer alle bytes ift. ASCII kan du arve fra ASCIIEncoding som vist herunder:
(eksemplet er mest for eksemplets skyld, det var det mest minimalistiske jeg kunne finde på)
Avatar billede driis Nybegynder
27. oktober 2006 - 17:24 #2
using System;
using System.IO;
using System.Text;

namespace EncodingTest
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Encoding enc = new InvertEncoding();
            using (StreamWriter sw = new StreamWriter("D:\\test.txt", false, enc))
            {
                sw.Write("Hello, world");
            }

            using (StreamReader sr = new StreamReader("D:\\test.txt", enc))
            {
                Console.WriteLine(sr.ReadToEnd());
            }
        }
    }
   
    public class InvertEncoding : ASCIIEncoding
    {
        private Encoding baseEncoding = new ASCIIEncoding();

        public override Encoder GetEncoder()
        {
            return new InvertEncoder(ASCII);
        }

        public override Decoder GetDecoder()
        {
            return new InvertDecoder(ASCII);
        }
    }

    internal class InvertEncoder : Encoder
    {
        private readonly Encoding baseEncoding;

        public InvertEncoder(Encoding baseEncoding)
        {
            this.baseEncoding = baseEncoding;
        }
       
        public override int GetByteCount(char[] chars, int index, int count, bool flush)
        {
            return baseEncoding.GetByteCount(chars, index, count);
        }

        public override int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex, bool flush)
        {
            int rv = baseEncoding.GetBytes(chars, charIndex, charCount, bytes, byteIndex);
            for (int i = byteIndex; i < rv + byteIndex; i++)
                bytes[i] = (byte)~bytes[i];
            return rv;
        }
    }
   
    internal class InvertDecoder : Decoder
    {
        private readonly Encoding baseEncoding;
       
        public InvertDecoder(Encoding baseEncoding)
        {
            this.baseEncoding = baseEncoding;
        }
       
        public override int GetCharCount(byte[] bytes, int index, int count)
        {
            return baseEncoding.GetCharCount(bytes, index, count);
        }

        public override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex)
        {
            for (int i = byteIndex; i < byteIndex + byteCount; i++)
                bytes[i] = (byte) ~bytes[i];
            return baseEncoding.GetChars(bytes, byteIndex, byteCount, chars, charIndex);
        }
    }
}
Avatar billede driis Nybegynder
27. oktober 2006 - 17:26 #3
(Du kan kigge i filen der skrives og se, at der faktisk er blevet skrevet de omvendte bytes på disken).
Avatar billede md_craig Nybegynder
28. oktober 2006 - 15:59 #4
Ja jeg er godt klar over at man bare gør det "Sådan"...

Det jeg er lidt interesseret i er "Do Rights" og "Do Wrongs"... er der nogle ting man skal specielt tage højde for, noget man skal huske man tit glemmer... ect. ect. ect... Det jeg ledte efter er egentlig i henhold til det jeg skriver, at det skal gøres korrekt...

Men ellers tak for svaret... håber du måske kender lidt sider der ude der behandler emnet lidt mere dybdegående?
Avatar billede driis Nybegynder
29. oktober 2006 - 09:59 #5
Nu er det jo ikke så ofte, man har brug for en custom encoding, som du efterlyser.
Måske hvis du beskriver lidt bedre, hvorfor du vil lave en custom encoding, kan det være nemmere at hjælpe.

Generelt vil jeg mene at man skal undgå det, hvis det er muligt, idet det bryder interoperabilitet med andre programmer (eks. du skriver en fil, den er nu umulig at læse i notepad, etc.)

Det er naturligvis vigtigt at holde sig for øje, at man altid skal kunne komme tilbage til nøjagtig den samme karaktersekvens, for alle mulige inputs, ved at køre den encodede buffer gennem decoderen. M.a.o, hvis du:
Input => Encode => Decode => Output
Så skal
Input == Output
For alle tænkelige sekvenser af Input.
Avatar billede md_craig Nybegynder
29. oktober 2006 - 10:49 #6
Sagen er at jeg har noget data der kommer ind på in Com port, som er incoded specielt, og ikke efter nogen konversiel Encoding... derfor skal jeg have lavet min egen encoding for at få det decodet korrekt...

Encodingen indeholder nemlig specielle encodings for Kursiv og Bold... dvs. at I, kursiv I og Bold I har hver sin en encoding... det skal naturlgivis alt sammen decodes, og bare til I, da man er ligeglad med Kursiv og Bold...
Avatar billede md_craig Nybegynder
30. oktober 2006 - 21:27 #7
Ok nu viser der sig så noget som gør tingene lidt mere logiske...
Og gør at din ide med at arve fra ASCII måske alligevel er ret så brugbar...

Sagen er åbenbart at man har taget et alm. ASCII tegnsæt, og så udvidet det ved at lade den første bit være Italic indikator...

ASCII er jo sådan set et 7 bits tegnsæt (når det ikke er extended), de sidste 128 kombinationer der så er i en byte i forhold til, er så brugt til at have hele ASCII tegnsættet igen... men i Italic form...

Så jeg skulle i teorien bare lige kunne lave en % 128 på alle bytes i GetChars og så kalde ASCII's egen GetChars...

Det var bare ikke lige til at se før man kom dybt ned i det, da der ikke forelå nogen dokumentation på dette...

Nu er det så... Findes der måske enda en Standard Encoding for dette?...
Avatar billede driis Nybegynder
31. oktober 2006 - 18:35 #8
Nej, jeg tror ikke der findes en standard encoding for dette.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester