Avatar billede noobsaibot Nybegynder
22. januar 2008 - 16:02 Der er 9 kommentarer

Encode en streng?

Hej Experter,

Jeg er ved at eksperimentere lidt med at hente e-mails via en pop3 klasse, som jeg fand fandt på Codeproject.com

Når jeg får e-mailen fra mailserveren er mailen ofte encoded forskelligt (både utf-8 og iso-8859-1).

Hvordan kan jeg konvertere den streng jeg modtager, så den får det rigtige format?
Avatar billede arne_v Ekspert
22. januar 2008 - 16:10 #1
Proev og laes headerne som US ASCII og saa laes resten baseret paa
content type og transfer encoding.
Avatar billede noobsaibot Nybegynder
22. januar 2008 - 16:11 #2
Kan du måske uddybe det lidt mere .. :)
Avatar billede arne_v Ekspert
22. januar 2008 - 17:09 #3
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit

betyder at body skal laeses som ISO-8859-1

Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

betyder at body foerst skal QP decodes og derefter laeses som UTF-8.
Avatar billede noobsaibot Nybegynder
22. januar 2008 - 17:41 #4
1) hvordan "læser" jeg som ISO-8859-1?
2) hvordan QP decoder jeg?
Avatar billede noobsaibot Nybegynder
22. januar 2008 - 18:13 #5
hvis du har mulighed for at give et par eksempler ville det være kanon :)
Avatar billede arne_v Ekspert
22. januar 2008 - 18:32 #6
re 1)

Enten med en StreamReader med passende Encoding eller konverterer fra byte[]
via Encoding.GetString
Avatar billede arne_v Ekspert
22. januar 2008 - 18:35 #7
re 2)

Jeg har en stump C# liggende som kan decode QP.
Avatar billede arne_v Ekspert
23. januar 2008 - 04:03 #8
Til inspiration:

    public class Mime
    {
        private static string FromQP(string s)
        {
            StringBuilder sb = new StringBuilder("");
            int ix = 0;
            while(ix < s.Length)
            {
                if(s[ix] == '=')
                {
                    sb.Append((char)int.Parse(s.Substring(ix + 1, 2),  NumberStyles.HexNumber));
                    ix += 3;
                }
                else
                {
                    sb.Append(s[ix]);
                    ix++;
                }
            }
            return sb.ToString();
        }
        private const string SEP = "\r\n\r\n";
        private const string TYPE = "Content-Type:";
        private const string CHARSET = "charset=";
        private const string TRANSFER = "Content-Transfer-Encoding:";
        private const string QP = "quoted-printable";
        public static string DecodeBody(byte[] b)
        {
            int split = Encoding.ASCII.GetString(b).IndexOf(SEP);
            bool qp = false;
            Encoding enc = Encoding.ASCII;
            using(StreamReader hdr = new StreamReader(new MemoryStream(b, 0, split)))
            {
                string line;
                while((line = hdr.ReadLine()) != null)
                {
                    if(line.Contains(TYPE) && line.Contains(CHARSET))
                    {
                        int ix = line.IndexOf(CHARSET) + CHARSET.Length;
                        enc = Encoding.GetEncoding(line.Substring(ix));
                    }
                    if(line.Contains(TRANSFER) && line.Contains(QP))
                    {
                        qp = true;
                    }
                }
            }
            StringBuilder sb = new StringBuilder();
            using(StreamReader body = new StreamReader(new MemoryStream(b, split + SEP.Length, b.Length - split - SEP.Length), enc))
            {
                string line;
                while((line = body.ReadLine()) != null)
                {
                    if(!qp)
                    {
                        sb.Append(line);
                    }
                    else
                    {
                        sb.Append(FromQP(line));
                    }
                    sb.Append(Environment.NewLine);
                }
            }
            return sb.ToString();
        }
    }
Avatar billede arne_v Ekspert
09. juni 2008 - 04:52 #9
OK ?
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