Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   =E2=80=9E umwandeln (https://www.delphipraxis.net/179052-%3De2%3D80%3D9e-umwandeln.html)

josefkoller 11. Feb 2014 18:38

=E2=80=9E umwandeln
 
Hallo,

ich bekomme im Mailtext aus pop3send von synapse folgende Zeichenfolgen:

=E2=80=9E (wäre ein Gänsefüßchen).

Delphi-Quellcode:

Der =E2À=9EWorkshop=E2À=9C hört sich gut an. Falls ihr wieder sowas plant gib mit ....
Wie wandle ich denn einen solchen Text mit solchen Zeichen in "lesbaren" Text um?

Natürlich sind in dem Text auch noch andere Sonderzeichen (=C3=BC) für ü usw.

Danke.

Josef

himitsu 11. Feb 2014 19:01

AW: =E2=80=9E umwandeln
 
Zitat:

Zitat von josefkoller (Beitrag 1247459)
Der =E2À=9EWorkshop=E2À=9C hört sich gut an. Falls ihr wieder sowas plant gib mit ....

Das nennt sich Quoted-Printable.

Wenn der Text aber in echt so aussieht, dann kannst du es vergessen.
Denn À und ö sind nicht kodiert, weswegen es dir dann das UTF-8 zerschießt.



=XX ist erstmal ein codiertes/gequtetes Zeichen in hexadezimaler Darstellung, was man umwandeln kann.

Und dann sieht es so aus, als wenn es dahinter UTF-8 wäre, was man ebenfalls nochmal umwandeln müsste.

Die genaue Codierung (UTF-8) müsste aber irgendwo im Header der Message drinstehn,
genauso wie die erste Codierung eigentlich auch im Header erwähnt worden sein müsste. (es sei denn sie ist per Default immer so)

Indy hat da aber bestimmt irgendwo auch eine Encodingfunktion für das =XX rumliegen. (z.B. TIdEncoderQuotedPrintable)

Sir Rufo 11. Feb 2014 19:30

AW: =E2=80=9E umwandeln
 
Diese Umwandlung kann synapse auch.

himitsu 11. Feb 2014 19:36

AW: =E2=80=9E umwandeln
 
Zitat:

Zitat von Sir Rufo (Beitrag 1247466)
Diese Umwandlung kann synapse auch.

Gut, dann hoff ich, es kann seinen Mist auch selber wieder entschlüsseln. :stupid:

Sir Rufo 11. Feb 2014 20:08

AW: =E2=80=9E umwandeln
 
Zitat:

Zitat von himitsu (Beitrag 1247467)
Zitat:

Zitat von Sir Rufo (Beitrag 1247466)
Diese Umwandlung kann synapse auch.

Gut, dann hoff ich, es kann seinen Mist auch selber wieder entschlüsseln. :stupid:

:gruebel:

Ja logisch (siehe meine Signatur)

josefkoller 11. Feb 2014 20:34

AW: =E2=80=9E umwandeln
 
Hi,

naja, wenn's so einfach wäre:

in synapse hab ich es schon probiert:

Der Header sieht so aus:

Delphi-Quellcode:

--001a11c34908e0619204f16fdbc2
Content-Type: multipart/alternative; boundary=001a11c34908e0619004f16fdbc1

--001a11c34908e0619004f16fdbc1
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Mit TPop3send->TMimeMess hab ich auch alles Mögliche eingestellt.

mess.DecodeMessage;
mess.MessagePart.DecomposeParts;
// mess.MessagePart.CharsetCode := UTF_8;
[/DELPHI]

Alles mal vor ..decode, dann nach ...decode, dann mit ...UTF-8, dann ohne, dann das gleiche nochmals bei den einzelnen Parts usw. Auch mit anderen Zeichensätzen, ISO_....., CP_....

Diese HEX-Werte sind immer drin.

Soweit ich das sehe, ist diese Beispielmail ein paar Mal weitergeleitet worden. (Re:Re:)

Auch die werte für dasselbe zeichen sind unterschiedlich: '=C3=BC', 'ü', und '=FC', 'ü',...

Wenn das synapse umwandeln kann, kannst du mir auch sagen, wie ......:oops:

Ich hab's mal mit replace versucht, aber es gibt so viele Varianten, daß es sinnlos ist, sie alle zu finden und zu ersetzen.

Danke

Josef

creed steiger 11. Feb 2014 21:12

AW: =E2=80=9E umwandeln
 
http://de.wikipedia.org/wiki/Umlaut#UTF-8

http://en.wikipedia.org/wiki/Quoted-printable

http://synapse.ararat.cz/doc/help/sy...uotedPrintable

https://gitorious.org/delphi/synapse...0:synacode.pas

http://sourceforge.net/mailarchive/m...sg_id=31522428

himitsu 11. Feb 2014 22:49

AW: =E2=80=9E umwandeln
 
Zitat:

Zitat von josefkoller (Beitrag 1247471)
Auch die werte für dasselbe zeichen sind unterschiedlich: '=C3=BC', 'ü', und '=FC', 'ü',...

Dann ist da definitiv was im Arsch.

=C3=BC könnte das UTF-8-ü sein (eventuell auch UCS-2, aber ich glaub eher an UTF-8 .... hab das jetzt nicht nachgerechnet),
aber im UTF-8, im ANSI und sonstwie im Unicode ist das =FC total falsch.
In den deutschen Codepages ist das ü meistens ein =81.

josefkoller 12. Feb 2014 00:30

AW: =E2=80=9E umwandeln
 
Hallo,

ich such mir da Deinen in der synachar.pas ab und in der synacode sind auch noch "seitenweise" Funktionen.

Danke für den Hinweis. Mit "DecodeQuotedPrintable" schaut's schon ganz manierlich aus.

Nur.... bei einer Mail, auch mit Re:Re: ist ein Mac Rechner dabei.

Da sind jetzt "???" statt der ü,ö, usw.

Wenn ich das dann versuche umzuwandeln, stehen bei den Texten der anderen Rechner wieder "falsche" Zeichen.

Es ist zum Verzweifeln mit diesen Zeichensätzen.

vielleicht auch dazu noch ein Tipp??

Danke.

Josef

himitsu 12. Feb 2014 02:28

AW: =E2=80=9E umwandeln
 
Zitat:

Re:Re:
Irgendeines der Programme hat Mist gebaut, die Codierung geschrottet und jetzt bist du am Arsch.



Entweder du versuchst das manuell zu übersetzen und das bezieht sich vorallem auf das UTF-8, welches du Zeichen für Zeichen selber übersetzen mußt.
Du dekodiertst also erst das Quoted-Printable und machts den Rest manuell.
Die Zeichen, welche sich übersetzen lassen (welche also der UTF-8-Codierung entsprechen), werden übersetzt und die Restlichen werden unverändert übernommen (billig von AnsiChar nach Char gekastet).

Oder du nutzt das, was funktioniert. (mir ist noch keine UTF-8-Dekodierfunktion untergekommen, welche Fehler versucht zu beheben)
Das Quoted-Printable selber scheint ja korrekt zu sein, womit du das erstmal auf den Text anwenden kannst.
Könntest du
Delphi-Quellcode:
UTF8ToString
verwenden und wenn das das UTF-8 dekodiert, dann wird das genommen und ansonsten lässt du den Schott-String so, wie er ist.
Delphi-Quellcode:
S := UTF8ToString(MyText);
if S = '' then
  S := MyText;
Oder beim UTF-8 wird eben fehlerignorierend übersetzt.
MSDN-Library durchsuchenMultiByteToWideChar (wird vermutlich auch von den getesteten Funktionen verwendet), ersetzt "ungültige" Zeichen, oder Zeichen, welche nicht in das Zielformat passen, jeweils in ein "?".

josefkoller 12. Feb 2014 09:36

AW: =E2=80=9E umwandeln
 
Hallo,

ich hole mir für meine Probiererei Mails von meinem Mailserver.

Ich hab jetzt besagte Mail mal in meinem Thunderbird gesucht.

Das Blöde ist, daß dort auch besagte Fragezeichen gefunden und interpretiert werden.
Die Thunderbird Leute müssen also irgendeine Funktionen benutzen, die sowas findet.

Der Quelltext kommt bei beiden (also bei meinem pop3 und in Thunderbird) gleich an.

In Thunderbird Quelltext6 steht z. B. =D6 für "Ö", bei mir auch.

Bei Thunderbird kommt dann in der Ansicht ein "Ö" raus, bei mir ein "?".

Die bei Thunderbird bekommen es hin und ich nicht. Das ärgert mich.:(

Vielleicht doch noch eine Idee??

Danke

Josef

Und noch was:
Der Sender ist ein MacRechner. Das Sonderzeichen dieser Mail für "ä" lautet: =E4. In den anderen Quelltexten steht für ä, =C3=A4.

himitsu 12. Feb 2014 12:25

AW: =E2=80=9E umwandeln
 
Ein einzelnes =D6 ist nunmal kein gültiges UTF-8-Zeichen :!:

Hat der Thunderbird da eventuell eine andere Codierung angegeben?
#$D6 bzw. #214 ist das Ö in den meisten deutschen ANSI-Kodierungen.

Namenloser 12. Feb 2014 13:04

AW: =E2=80=9E umwandeln
 
Mit sowas hatte ich auch schon mal zu kämpfen, allerdings in PHP. Es scheint bei Mails leider häufiger vorzukommen, dass sie falsch enkodiert sind, als umgekehrt. Es bleibt einem kaum etwas anderes übrig, als mit Heuristiken zu arbeiten (bzw. entsprechende Bibliotheken zu verwenden).

josefkoller 12. Feb 2014 13:49

AW: =E2=80=9E umwandeln
 
Hallo,

bei meinem aktuellen Problem hab ich es jetzt so gemacht:

Delphi-Quellcode:
...
pop.RetrStream(i, retrStream);
      retrStream.Position := 0;
      mess.Lines.LoadFromStream(retrStream);
      mess.Lines.Text:=replaceUmlaute(mess.Lines.Text);
      mess.Lines.Text:=DecodeQuotedPrintable(mess.Lines.Text);
...
Delphi-Quellcode:
function replaceUmlaute(Text: string): string;
begin
  Text := StringReplace(Text, '=F6', 'ö', [rfReplaceAll]);
  Text := StringReplace(Text, '=D6', 'Ö', [rfReplaceAll]);
  Text := StringReplace(Text, '=FC', 'ü', [rfReplaceAll]);
  Text := StringReplace(Text, '=DF', 'ß', [rfReplaceAll]);
  Text := StringReplace(Text, '=E4', 'ä', [rfReplaceAll]);
  Text := StringReplace(Text, '=C4', 'Ä', [rfReplaceAll]);
  Text := StringReplace(Text, '=DC', 'Ü', [rfReplaceAll]);
  Result := Text;
end;
Also erst wird nach diesen "falschen" =D6 gesucht und ersetzt (mit function replaceUmlaute)und dann mit function DecodeQuotedPrintable aus synacode.pas die "richtigen" HEX Werte, also die =C3=B6, usw. umgewandelt.

diese Reihenfolge ist notwendig, sonst klappt es wieder nicht!


Dann schaut es gut aus. Ich werd mal noch ein paar andere Mails damit laden. Wahrscheinlich tauchen noch andere Werte auf. Die müßte ich dann halt auch noch in meine funktion reinschreiben. Oder vielleicht gleich die ganze Zeichensatztabelle??

Nur ...welche? Was ist denn das für ein Zeichensatz, der =F6,=D6, usw. definiert???

Danke.

Josef

P.S.
Ein weiteres Problem sind Mails, die mit der PHP Mail funktion verschickt werden.
Bei php mail() reicht es, ein from und ein to anzugeben.

Du findest dann kein Date oder keine Message-ID im Kopf usw. Auch kann "Message-Id" oder "Message-ID" im Header geschrieben werden, um die Werte zu definieren. usw.

Mit anderen Worten:
Ich habe es mir viel einfacher vorgestellt,meinen eigenen pop client zu machen.:oops:

In einem anderen Post hab ich gefragt, wie ich ein Datum in Form von "Mon, 3 Feb 2014 02:57:08 +0100 (CET)" im Headertext finden kann (also kein Date: davor).

Bisher keine Antworten. Ich weiß es auch nicht.

vielleicht dazu eine Idee???

Namenloser 12. Feb 2014 14:40

AW: =E2=80=9E umwandeln
 
Zitat:

Zitat von josefkoller (Beitrag 1247547)
Nur ...welche? Was ist denn das für ein Zeichensatz, der =F6,=D6, usw. definiert???

Gar keiner. Es ist nur eine Schreibweise, um Byte-Werte zu kodieren. Wie diese Bytewerte zu interpretieren sind, ob als ANSI, als UTF-8 usw., darüber kann man ohne weitere Informationen keine Aussage machen.

Theoretisch müsste im Header der E-Mail das korrekte Encoding angegeben sein, darauf kann man sich aber nur bedingt verlassen.

p80286 12. Feb 2014 15:39

AW: =E2=80=9E umwandeln
 
Zitat:

Zitat von josefkoller (Beitrag 1247547)
Also erst wird nach diesen "falschen" =D6 gesucht und ersetzt (mit function replaceUmlaute)und dann mit function DecodeQuotedPrintable aus synacode.pas die "richtigen" HEX Werte, also die =C3=B6, usw. umgewandelt.

diese Reihenfolge ist notwendig, sonst klappt es wieder nicht!

Bist Du Dir da ganz sicher?
Eigentlich sollte erst die Dekodierung der 3Byte und 2Byte Sequenzen erfolgen und dann zum Schluß der Rest der übrig bleibt. Bei Deiner Vorgehensweise kann es sein, daß in einer Sequenz die mehrere Bytes enthält eine Falschinformation eingefügt wird.

Zitat:

Es ist nur eine Schreibweise, um Byte-Werte zu kodieren. Wie diese Bytewerte zu interpretieren sind, ob als ANSI, als UTF-8 usw., darüber kann man ohne weitere Informationen keine Aussage machen.
:thumb::thumb:

Gruß
K-H

Mikkey 12. Feb 2014 15:50

AW: =E2=80=9E umwandeln
 
Zitat:

Zitat von Namenloser (Beitrag 1247565)
Zitat:

Zitat von josefkoller (Beitrag 1247547)
Nur ...welche? Was ist denn das für ein Zeichensatz, der =F6,=D6, usw. definiert???

Gar keiner. Es ist nur eine Schreibweise, um Byte-Werte zu kodieren. Wie diese Bytewerte zu interpretieren sind, ob als ANSI, als UTF-8 usw., darüber kann man ohne weitere Informationen keine Aussage machen.

Theoretisch müsste im Header der E-Mail das korrekte Encoding angegeben sein, darauf kann man sich aber nur bedingt verlassen.

Es ist DOS-Westeuropäisch, AFAIR Codepage 451

josefkoller 12. Feb 2014 19:28

AW: =E2=80=9E umwandeln
 
[QUOTE=Es ist DOS-Westeuropäisch, AFAIR Codepage 451[/QUOTE]

Dank für den Hinweis. DOS-Westeuropäisch ist 850. die ist es aber auch nicht.
Dafür hab ich DOS-mitteleuropäisch 852 gefunden. die scheint zu passen.

Die kann auch mit den synapse funktionen angewandt werden.

Nur, im Ergebnis haben dann die anderen Mails wieder fehlerhafte Zeichen drin.

Das Einzige was bisher hilft, ist mein eigenes String Replace.

Ich schreib da jetzt mal noch einige Zeichen aus der CP 852 rein und dann muß es passen.

Danke für die Hinweise und für die Geduld.

Josef


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz