Quoted-Printable Kodierung zu UTF-8 konvertieren (St=C3=B6rung - Störung)

  • Das ist die hexadezimal Kodierung in UTF-8, siehe hier: https://www.fileformat.info/info/charset/UTF-8/list.htm (C3B6)

    Ich schätze es gibt keine direkte Methode deinen String umzuwandeln, du musst da wohl was mit StringReplace basteln.

    For Schleife mit ChrW/AscW (von 0x1000 bis 0xFFFF oder so ersetzen mit den Zeichen) oder einzelne Zeichen selber ersetzen (also Array mit Verknüpfung zwischen C3B6 und ö erstellen) sollte funktionieren.

  • in einer Variablen habe ich die Zeichenkette "St=C3=B6rung".

    Wo kommt die Zeichenkette her? Sieht die Zeichenkette auch so verstümmelt aus, wenn du sie mit einer MsBox anzeigen lässt, oder nur mit ConsoleWrite?

    Ich kenne folgende Funktionen zur Konvertierung von Zeichenketten in eine andere Codepage:

    _WinAPI_MultiByteToWideChar, _WinAPI_MultiByteToWideCharEx, _WinAPI_WideCharToMultiByte, _WinAPI_CharToOem, _WinAPI_OemToChar, StringToBinary/BinaryToString

  • Ich schätze es gibt keine direkte Methode deinen String umzuwandeln, du musst da wohl was mit StringReplace basteln.

    Ich denke, ich habe diesbzgl. etwas gefunden - siehe unten ;)

    Wo kommt die Zeichenkette her? Sieht die Zeichenkette auch so verstümmelt aus, wenn du sie mit einer MsBox anzeigen lässt, oder nur mit ConsoleWrite?

    Die Zeichenkette stammt wahrscheinlich aus einer eMail - Stichwort Quoted-Printable-Kodierung .

    Sie ist nicht 'verstümmelt', sondern das Gleichheitszeichen dient der Maskierung von Zeichen, die außerhalb des zulässigen Bereiches liegen (analog zu % bei Links). =C3=B6 -> C3B6 ist hexadezimal UTF-8 für 'ö'.

    Meine nachfolgende Lösung wurde der folgenden Quelle entnommen : POP3.au3 UDF 2.0.1.

    Author .....: Prog@ndy ; Modified ......: mLipok

    Download der 'POP3.au3 UDF 2.0.1' (enthält die Datei "Quoted-printable.au3")

    Da Links gerne mal das Zeitliche segnen, werde ich die Dateien noch mal anhängen. Man benötigt nur die "Quoted-printable.au3 UDF".

    Hier mein Skriptbeispiel (etwas erweitert):

    Wie man sieht, eignet sich die "Quoted-printable.au3 UDF" , auch abseits von POP3, gut für solche Konvertierungsaufgaben :).

    Anmerkung :

    Die Codepage wird in der u.a. Funktion mit z.B. utf-8 übergeben :

    _QuotedPrintable_DecodeEncodedWord("=?utf-8?Q?" & $sSourceString & "?=")

    Bei mir werden die Sonderzeichen in der ConsoleWrite-Ausgabe allerdings trotzdem maskiert - bei MsgBox geht es. Die Angabe von 65001 als Codepage löst das Problem (bei mir) nicht. Ich habe daher im obigen Beispiel die Standardfunktion _WinAPI_WideCharToMultiByte verwendet. Wer Lust hat, kann sich die UDF ja entsprechend umbauen.

    Gruß Musashi

  • Die Zeichenkette stammt wahrscheinlich aus einer eMail - Stichwort Quoted-Printable-Kodierung .

    Aaah... ja, sehr gut... und wieder etwas klüger... mal gut, dass ich danach gefragt habe, woher die Zeichennkette stammt. ;)

    Bei mir werden die Sonderzeichen in der ConsoleWrite-Ausgabe allerdings trotzdem maskiert - bei MsgBox geht es.

    ConsoleWrite: "Characters are converted to ANSI before being written."

    Code
    ConsoleWrite("> Decoded  : " & _WinAPI_WideCharToMultiByte($sDestString, @Compiled ? 1 : 65001) & @CRLF)

  • Interessant. Man wird jeden Tag ein kleines Stückchen schlauer :D

    Ich tendiere ja persönlich dazu inzwischen alles als HexString (UTF8) zu übertragen/speichern/sonstiges, denn 0-9A-F bekommt jedes Format einwandfrei hin (natürlich braucht man dann mehr Bandbreite/Speicher, weil man doppelt so viele Zeichen hat, aber es funktioniert wenigstens (meistens... manchmal denkt sich ein Programm auch, hey lass mal spontan irgendwelche Bytes rückwärts lesen, dann muss man kurz eine Schelle mit der Rückhand austeilen und dann gehts wieder)). Ansich finde ich es bescheuert, dass es überhaupt so viele Kompatibilitätsprobleme und den Bedarf an Umkodierern gibt... Ich will einfach die guten Alten ASC Zeiten wieder haben, da war Text noch eine Art "primitiver Datentyp" der durch seine Bits unmissverständlich eindeutig definiert war...

    Villeicht werde ich beim nächsten Mal wo ich auf soetwas stoße auch hier nachlesen wie das mit den verschieden kodierten Texten aussieht... mal schauen :D

    M

  • Aaah... ja, sehr gut... und wieder etwas klüger... mal gut, dass ich danach gefragt habe, woher die Zeichenkette stammt. ;)

    Keine Sorge - als ich die Zeichenfolge =C3=B6 sah klingelte zwar etwas, ich musste aber auch erst etwas suchen ;). Die Quoted-Printable-Kodierung ist halt der extremen Abwärtskompatibilität beim Mailversand geschuldet, wie man ja z.B. dem Wikipedialink aus meinem Beitrag #6 entnehmen kann.

    ConsoleWrite("> Decoded : " & _WinAPI_WideCharToMultiByte($sDestString, @Compiled ? 1 : 65001) & @CRLF)

    Die UDF enthält eine Funktion : _QuotedPrintable_MultiByteToWideChar()

    Diese funktioniert auch, wie man an der Ausgabe in der MsgBox und beim Schreiben des Strings in eine Datei (habe ich oben angefügt) sehen kann.

    Bei mir in der SciTE-Konsole sieht es aber so aus :

    ö wird als xF6 dargestellt, also U+00F6. Das dürfte eher an Einstellungen in meinen scite.config's liegen und ist mir, offen gesagt, auch nicht so wichtig. _WinAPI_WideCharToMultiByte tut es ja.

    Falls jemand Lust verspürt, könnte er/sie die UDF sicher etwas aufbereiten. Andererseits sind viele User wahrscheinlich weniger an den Details interessiert, da reicht es die UDF einzubinden - der Rest ist ein Einzeiler.

    Interessant. Man wird jeden Tag ein kleines Stückchen schlauer :D

    ...

    Ich will einfach die guten alten ASC Zeiten wiederhaben, da war Text noch eine Art "primitiver Datentyp" der durch seine Bits unmissverständlich eindeutig definiert war...

    Ja, diese ganze Konvertiererei ist bezeiten ein echter PITA.

    Sie ist allerdings auch ein interessantes Beispiel dafür, wieviel in der IT noch auf Konventionen des letzten Jahrtausends basiert :P.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    2 Mal editiert, zuletzt von Musashi (21. Februar 2019 um 15:31)

  • Das dürfte eher an Einstellungen in meinen scite.config's liegen und ist mir, offen gesagt, auch nicht so wichtig.

    Ja.

    Code: SciTEGlobal.properties
    # Editor pane, 0 = System default (ANSI)
    code.page=0
    # Output pane, 0 = System default (ANSI)
    output.code.page=0

    Bei mir habe ich beide Einträge in die SciTEUser.properties kopiert und auf 65001 (UTF-8) geändert.

  • alpines 21. Februar 2019 um 12:50

    Hat den Titel des Themas von „St=C3=B6rung - Störung“ zu „Quoted-Printable Kodierung zu UTF-8 konvertieren (St=C3=B6rung - Störung)“ geändert.
  • Hier ist ja noch einmal richtig Leben reingekommen, nachdem ich den grünen Haken bereits gesetzt habe.

    Ja, es ist richtig, die „verstümmelte“ Zeile entsteht, wenn aus speziell kodierten E-Mails etwas aus dem Quelltext kopiert wird.

    Das habe ich erst heute erfahren, da ich die eingangs zitierte Quelle von einem Bekannten erhalten habe, mit der Bitte, wie man das automatisch in eine lesbare Zeichenkette umwandeln kann.

    Mit dem Tipp von alpines konnte für die wenigen Zeichen sehr einfach eine „Übersetzung“ erstellt werden, sodass das Problem in Beitrag vier als gelöst gesetzt werden konnte.

    Danke :)

  • Ja, es ist richtig, die „verstümmelte“ Zeile entsteht, wenn aus speziell kodierten E-Mails etwas aus dem Quelltext kopiert wird.

    Das habe ich erst heute erfahren, da ich die eingangs zitierte Quelle von einem Bekannten erhalten habe, mit der Bitte, wie man das automatisch in eine lesbare Zeichenkette umwandeln kann.

    Mit dem Tipp von alpines konnte für die wenigen Zeichen sehr einfach eine „Übersetzung“ erstellt werden, sodass das Problem in Beitrag vier als gelöst gesetzt werden konnte.

    Falls Du das Problem häufiger hast, dann verwende am Besten die Lösung aus Beitrag #6 .

    Du musst dann nicht mehr einzelne Zeichen 'übersetzen', sondern es werden alle maskierten Zeichen mit einem Funktionsaufruf konvertiert. Die zugelassenen Zeichen im Bereich der Quoted-Printable-Kodierung sind die ASCII-Zeichen 9, 32..60 und 62..126, also :

    TAB

    Leerzeichen und !"#$%&'()*+,-./0123456789:;<

    >?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

    Alles andere wird mit = maskiert !

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."