( muszi | 2017. 02. 07., k – 20:05 )

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