Re: usædvanlige tegn i subject-felt

From: Mikkel C. Simonsen (none@mcs--post5.tele.dk.lh.bsd-dk.dk)
Date: Thu 07 Nov 2002 - 22:47:22 CET


Date: Thu, 07 Nov 2002 22:47:22 +0100
From: "Mikkel C. Simonsen" <none@mcs--post5.tele.dk.lh.bsd-dk.dk>
To: bsd-dk@bsd-dk.dk
Subject: Re: usædvanlige tegn i subject-felt

Claus Guttesen wrote:
>
> Hej.
>
> =?iso-8859-1?Q?Re:_BF8ger_om_FreeBSD?
>
> Den oprindelige tekst var - som de fleste kan læse sig
> til - Re: Bøger om FreeBSD.
>
> Men hvad er det der sker, hvilken mail-klient går ind
> og forandrer på teksten?

Alle mailklienter der overholder RFC'erne. En mailheader må ikke
indeholde "danske" bogstaver eller andre specialtegn. Som du kan se på
headeren i denne mail, overholder mit mail-program (Netscape 2.02) ikke
RFC-erne...

> Og hvordan programmerer jeg
> det i perl, så den kan tage hånd om sådanne ting?

Aner det ikke. Jeg bruger selv følgende C++ kode - det er sikkert både
dårligt og in-effektivt skrevet, men det virker ;-)

char* mimehdr2ans(char *ind, char *ud)
{
int l = strlen(ind);
int pos = 0;
int kode = 0;
int tegn, n;
int stat = 0;
int mt = 0;
int start = 0;
char hex[3], buffer[3][500];
char *ptr;

ptr = strstr(ind, "=?");
if (ptr != NULL)
        {
        start = ptr - ind;
        strncpy(ud, ind, start);
        ud[start] = 0;
        }

ptr = buffer[0];

for (n = 0; n < l; n++)
        {
        if (stat > 3) break;
        if (ind[n] == '?')
                {
                ptr[pos] = 0;
                stat++;
                ptr = buffer[stat-1];
                pos = 0;
                }
        else if (stat)
                {
                ptr[pos] = ind[n];
                pos++;
                }
        }

if (n < (l-1)) //Mere tekst
        {
        ptr = ind + (n+1);
        mt = 1;
        cout << "Mere tekst: " << ptr << endl;
        }

cout << "Buffer 0: " << buffer[0] << endl;
cout << "Buffer 1: " << buffer[1] << endl;
cout << "Buffer 2: " << buffer[2] << endl;

l = strlen(buffer[2]);
pos = start;

for (int n = 0; n < l; n++)
        {
        if ((! kode) && (buffer[2][n] == '=')) kode = 1;
        else if (kode == 1)
                {
                hex[0] = buffer[2][n];
                kode = 2;
                }
        else if (kode == 2)
                {
                hex[1] = buffer[2][n];
                hex[2] = 0;
                tegn = strtol(hex, NULL, 16);
                ud[pos] = tegn;
                pos++;
                kode = 0;
                }
        else if (buffer[2][n] == '_')
                {
                ud[pos] = ' ';
                pos++;
                }
        else
                {
                ud[pos] = buffer[2][n];
                pos++;
                }
        }

ud[pos] = 0;

if (mt) strcat(ud, ptr);

return ud;
}

Her er et lille test-program:

main()
{
char str1[200], str2[200];

cout << "Indtast str: ";
cin.getline(str1, 199);
cout << endl;

cout << mimehdr2ans(str1, str2) << endl;
}

Og her er output fra en lille test:

[C:\]test17
Indtast str: =?iso-8859-1?q?Claus=20Guttesen?= <none@cguttesen--yahoo.dk.lh.bsd-dk.dk>

Mere tekst: <none@cguttesen--yahoo.dk.lh.bsd-dk.dk>
Buffer 0: iso-8859-1
Buffer 1: q
Buffer 2: Claus=20Guttesen
Claus Guttesen <none@cguttesen--yahoo.dk.lh.bsd-dk.dk>

Venlig hilsen

Mikkel C. Simonsen



This archive was generated by hypermail 2b30 : Wed 15 Nov 2006 - 18:24:25 CET