Nem az UTF-8-at, hanem a quoted-printable kodolast nem (sem? :-)) szereti. En is munpack-kal csomagolom ki a csatolmanyokat, es valamikor regen irtam is egy awk szkriptet, ami a munpack altal eloallitott fileneveket (lenyegeben a quoted-printable kodolasban a kerdojelet X-szel helyettesiti) helyreallitja.
Itt talalhato, garancia termeszetesen nincs :-)
A standard inputon varja a munpack-fele filenevet, a standard outputra irja ki, hogy szerinte mi lehetett az eredeti filenev... ;-)
munpack-rename:
#! /bin/sh
awk -v Recode="/usr/bin/recode" -v OutputCharset="UTF-8" '
{
LineBuffer=LineBuffer sep $0;
sep=" "
}
END {
gsub("X=[ \t]+=X","X==X",LineBuffer);
DecodedLine="";
while (LineBuffer!="") {
Offset=index(LineBuffer,"=X");
if (Offset==0) {
DecodedLine=DecodedLine LineBuffer;
break
}
DecodedLine=DecodedLine substr(LineBuffer,1,Offset-1);
LineBuffer=substr(LineBuffer,Offset);
CharsetOffset=3;
Offset=index(substr(LineBuffer,CharsetOffset),"X");
if (Offset==0) {
DecodedLine=DecodedLine LineBuffer;
break
}
EncodingOffset=CharsetOffset+Offset;
Offset=index(substr(LineBuffer,EncodingOffset),"X");
if (Offset==0) {
DecodedLine=DecodedLine LineBuffer;
break
}
QWordTextOffset=EncodingOffset+Offset;
Offset=index(substr(LineBuffer,QWordTextOffset),"X=");
if (Offset==0) {
DecodedLine=DecodedLine LineBuffer;
break
}
QWordEndMarkOffset=QWordTextOffset+Offset;
Charset=substr(LineBuffer,CharsetOffset,EncodingOffset-CharsetOffset-1);
Encoding=toupper(substr(LineBuffer,EncodingOffset,QWordTextOffset-EncodingOffset-1));
QWordText=substr(LineBuffer,QWordTextOffset,QWordEndMarkOffset-QWordTextOffset-1);
if (Encoding=="Q") {
gsub("_","\x20",QWordText);
cmd="echo \"" QWordText "\" | " Recode " -fq \"" Charset "\"/quoted-printable..\"" OutputCharset "\"";
cmd | getline DecodedQWord;
close (cmd)
}
else if (Encoding=="B") {
cmd="echo \"" QWordText "\" | " Recode " -fq \"" Charset "\"/base64..\"" OutputCharset "\"";
cmd | getline DecodedQWord;
close (cmd)
}
else
DecodedQWord=QWord;
DecodedLine=DecodedLine DecodedQWord;
LineBuffer=substr(LineBuffer,QWordEndMarkOffset+1)
}
sub("^[ \t]+","",DecodedLine);
sub("[ \t]+$","",DecodedLine);
printf "%s\n",DecodedLine
}
'Teszt:
$ echo -n "=XISO-8859-2XQX=E1rv=EDzt=FBr=F5_t=FCk=F6rf=FAr=F3g=E9pX=" | ./munpack-rename
árvíztűrő tükörfúrógép