Quoted Printable decoden

  • Hey,
    ich hab grad ein Problem, dass ich alleine nicht gelöst bekomme :wacko:.

    Quoted-Printable ersetzt in einem Text alle Sonderzeichen durch ein '=' und de dazugehörigen Hex-Code. Aus einem '=' wird also '=3D' und aus einem 'ß' z.B. wird ein '=DF'.
    Außerdem wird, wenn eine Zeile zu lang wird ein Zeilenumbruch eingefügt, der mit einem '=' am Ende der Zeile gekennzeichnet wird.
    Mehr dazu am besten auf Wikipedia.

    Das zu decodieren dürfte ja nicht allzuschwer fallen...
    Zuerst entferne ich die '=' am Ende und ersetze die Zeilenumbrüche.

    [autoit]

    $retr = StringRegExpReplace($retr, '(.+)=\r\n', '$1')

    [/autoit]

    Jetzt muss man nur noch alle = & Hexcode ersetzen.
    Also hab ich gedacht ich nehme StringregExpReplace.
    Das Pattern dafür wäre:

    Code
    '=([0-9A-F]{2})'


    In $1 steht jetzt der Hex-Code. Nur leider kann ich damit nicht viel Anfangen, da ich ihn innerhalb von StringRegExp nicht umwandeln kann :(.
    Das müsste ja dann so irgendwie aussehen, aber das funktioniert logischerweise nicht.

    [autoit]

    $retr = StringRegExpReplace($retr, '=([0-9A-F]{2})', Chr(Dec('$1')))

    [/autoit]

    Einem Umweg mit StringregExp und Stringreplace kann ich auch nicht gehen, weil dann einige Zeichen doppelt ersetzt werden können und nicht alles gleichzeitig ersetzt wird.
    Hat da jemand eine Idee?

    lg
    anno2008

    2 Mal editiert, zuletzt von anno2008 (3. September 2010 um 18:11)

  • nicht schön, aber selten ^^

    [autoit]

    $text="H=E4tten H=FCte ein =DF im Namen, w=E4ren sie m=F6glicherweise keine H=FCte="&@crlf&" mehr,"&@crlf&"sondern H=FC=DFe."

    [/autoit][autoit][/autoit][autoit]

    $text=stringreplace($text,"="&@crlf,"")

    [/autoit][autoit][/autoit][autoit]

    $pos=0
    do
    $pos=stringinstr($text,"=",1,1,$pos+1)
    $QP=stringmid($text,$pos+1,2) ;hex
    $text=StringRegExpReplace($text,"(?s)="&$QP,chr(dec($QP)))
    until $pos=0

    [/autoit][autoit][/autoit][autoit]

    msgbox(0,0,$text)

    [/autoit]
  • Hey,
    dein Script hat das selbe Problem, wie wenn ich einfach StringReplace benutze.

    [autoit]

    $text = "=3DDF stra=DFe"
    ; kommt raus: ß straße

    [/autoit]

    Zuerst wird das =3D in ein = umgewandelt. Und danach Steht da noch =DF, das wird dann wieder in ein ß umgewandelt obwohl es stehen bleiben soll. Das ist so, weil StringRegExpReplace den ganzen Text ersetzt.
    Aber es ist ein Interessanter Ansatz, ich muss mir jetzt noch eine Funktion basteln, die nur an bestimmten Stellen ersetzt. Das bekomme ich hin, danke. :thumbup:

    lg anno2008

  • Hier die fertige Funktion:

    Spoiler anzeigen
    [autoit]

    $text = "H=E4tten H=FCte ein =DF im Namen, w=E4ren sie m=F6glicherweise keine H=FCte=" & @CRLF & _
    " mehr,=" & @CRLF & _
    "sondern H=FC=DFe."

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, "", _QuotedPrintableDecode($text))

    [/autoit] [autoit][/autoit] [autoit]

    Func _QuotedPrintableDecode($s_String)
    ; Andy, anno2008
    Local $pos = 0, $buffer1, $buffer2, $replace

    [/autoit] [autoit][/autoit] [autoit]

    $s_String = StringRegExpReplace($s_String, '(.+)=\r\n', '$1')
    While 1
    $pos = StringInStr($s_String, "=", 1, 1, $pos + 1)
    If $pos = 0 Then ExitLoop

    [/autoit] [autoit][/autoit] [autoit]

    $buffer1 = StringLeft($s_String, $pos - 1)
    $buffer2 = StringRight($s_String, StringLen($s_String) - $pos - 2)
    $replace = StringMid($s_String, $pos, 3)

    [/autoit] [autoit][/autoit] [autoit]

    If StringRegExp($replace, '=[0-9A-F]{2}') Then
    $replace = Chr(Dec(StringTrimLeft($replace, 1)))
    EndIf
    $s_String = $buffer1 & $replace & $buffer2
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Return $s_String
    EndFunc ;==>_QuotedPrintableDecode

    [/autoit]

    Keine Ahnung ob die nochmal jemand gebrauchen kann, aber ich poste sie mal...
    Braucht man vor allem bei Emails, weil die oft in dieses Format codiert werden.

  • Das kommt davon, wenn man "professionelle" Funktionen wie StringRegEx() verwendet, wenn man (wie ich) keine Ahnung davon hat!
    Stringreplace macht was es soll^^

    [autoit]

    $text="H=E4tten H=FCte ein =DF im Namen, w=E4ren sie m=F6glicherweise keine H=FCte="&@crlf&" mehr,"&@crlf&"sondern H=FC=DFe."&" =3DDF stra=DFe"

    [/autoit][autoit][/autoit][autoit]

    $text=stringreplace($text,"="&@crlf,"")

    [/autoit][autoit][/autoit][autoit]

    $pos=0
    do
    $pos=stringinstr($text,"=",1,1,$pos+1)
    $QP=stringmid($text,$pos+1,2) ;hex
    $text=StringReplace($text,"="&$QP,chr(dec($QP)))
    until $pos=0

    [/autoit][autoit][/autoit][autoit]

    msgbox(0,0,$text)

    [/autoit]
  • Immer noch das selbe Problem :)
    Das klappt nur zufällig, weil vorher schonmal =DF auftaucht und deshalb schon ersetzt wird.
    Benutzt du nur

    [autoit]

    $text = "=3DDF stra=DFe"

    [/autoit]


    dann isses wieder falsch.
    Außerdem bricht er ab, wenn ein = kommt und danach keine Hexzahl.

    StringRegExpReplace macht hier nix anderes als Stringreplace :).

    Naja, die andere Funktion die ich oben gepostet hab funktioniert perfekt. Danke für die Hilfe!