Hallo,
in einer Variablen habe ich die Zeichenkette "St=C3=B6rung".
Wie lautet die Funktion in AutoIt, die daraus "Störung" macht?
Danke
Hallo,
in einer Variablen habe ich die Zeichenkette "St=C3=B6rung".
Wie lautet die Funktion in AutoIt, die daraus "Störung" macht?
Danke
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.
oh - das hätte ich nicht gedacht
Wäre glatt davon ausgegangen, dass es dafür bereits eine UDF oder einen Befehl gibt.
Danke.
PS: Die Tabelle von Dir ist hilfreich - grüner Haken gesetzt
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):
#include <WinAPI.au3>
#include <FileConstants.au3>
#include "Quoted-printable.au3"
Global $sSourceString, $sDestString
; Beispiel 1 :
; ------------
; --> Störung
$sSourceString = 'St=C3=B6rung'
$sDestString = _QuotedPrintable_DecodeEncodedWord("=?utf-8?Q?" & $sSourceString & "?=")
MsgBox(64, 'Beispiel 1 : ', 'Original : ' & $sSourceString & @CRLF & @CRLF & 'Decoded : ' & $sDestString)
ConsoleWrite("+ Original : " & $sSourceString & @CRLF)
ConsoleWrite("> Decoded : " & _WinAPI_WideCharToMultiByte($sDestString, 65001) & @CRLF)
; Beispiel 2 :
; ------------
; --> Dies ist ein längerer großer Text mit den Umlauten Ä Ö und Ü sowie ä ö und ü. Außerdem das sz, also ß und Zeichen wie ? % $ § & !
$sSourceString = 'Dies ist ein l=C3=A4ngerer gro=C3=9Fer Text mit den Umlauten =C3=84 =C3=96 und =C3=9C sowie =C3=A4 =C3=B6 und =C3=BC. Au=C3=9Ferdem das sz, also =C3=9F und Zeichen wie ? % $ =C2=A7 & !'
$sDestString = _QuotedPrintable_DecodeEncodedWord("=?utf-8?Q?" & $sSourceString & "?=")
MsgBox(64, 'Beispiel 2 : ', 'Original : ' & $sSourceString & @CRLF & @CRLF & 'Decoded : ' & $sDestString)
ConsoleWrite("+ Original : " & $sSourceString & @CRLF)
ConsoleWrite("> Decoded : " & _WinAPI_WideCharToMultiByte($sDestString, 65001) & @CRLF)
; V2 : String in Textdatei schreiben :
Global Const $hFile = FileOpen(@ScriptDir & "\QuotedPrintable.txt", BitOR($FO_OVERWRITE, $FO_UTF8_NOBOM))
If Not @error Then
FileWrite($hFile, $sDestString)
FileClose($hFile)
Else
MsgBox(16, 'Fehler : ', 'Fehler beim Schreiben in "\QuotedPrintable.txt" ! ' & @CRLF)
EndIf
Alles anzeigen
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."
Interessant. Man wird jeden Tag ein kleines Stückchen schlauer
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
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
...
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 .
Gruß Musashi
Das dürfte eher an Einstellungen in meinen scite.config's liegen und ist mir, offen gesagt, auch nicht so wichtig.
Ja.
# 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.
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
Besten Dank Musashi.