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