Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy und UTF-8 Betreff (https://www.delphipraxis.net/63046-indy-und-utf-8-betreff.html)

MasterEvil 13. Feb 2006 10:58


Indy und UTF-8 Betreff
 
Hi leutz,

hab ein Problem mit Indy 10.
Und zwar geht es um codierte Betreffzeilen in E-Mails.

Nachdem ich einen Bug in Indy gelöst habe, decodiert Indy jetzt richtig ISO Codierungen,
allerdings lässt er UTF-8 Codierungen in Ruhe.
Dann kommen dort solche Betreffs wie dieser zurück:
=?utf-8?Q?AW:_Neues_Projekt_Sch=C3=BCrn_Warenwirtschaft_ ?=

Wie kriege ich diesen nun umcodiert in einen AnsiString?, sprich:
AW: Neues Projekt Schön Warenwirtschaft

Interessant ist auch, dass Indy eigentlich diese umcodierung kann.
Da der Bodytext als echter UTF-8 String ankommt, den ich dann zur anzeige nurnoch mit UTF8ToAnsi umcodieren muss.
Indy scheint das nur bei Betreffs nicht anzuwenden.

Jemand eine Idee?

greetz
Steffen

Samashy 27. Feb 2006 11:52

Re: Indy und UTF-8 Betreff
 
Ich kann Dir leider Deine Frage nicht beantworten, aber kannst Du mir verraten, wie Du den Bug in Indy gelöst hast?

Romy

OlloSoft 28. Feb 2006 09:18

Re: Indy und UTF-8 Betreff
 
Hi MasterEvil,

ja ja, auch Indy 10 ist (leider immer noch nicht) fehlerfrei :-(

Du solltest dir mal die JEDI-Unit (Project Jedi - Home) JCLUNicode.pas ansehen.

Hier gibt es u. a.
function UTF8ToWideString(S: AnsiString): WideString;



Bye Ollo

MasterEvil 28. Feb 2006 11:40

Re: Indy und UTF-8 Betreff
 
Hallo ;)

hab das Problem bereits selber gelöst.
UT8ToWideString bringt in diesem Fall auch nichts, da es ja nur eine Codierung ist um es zu versenden ;)

@Samashy
Das Problem mit der ISO Codierung kannst du lösen, indem du in der Unit IdCoderHeader in der Methode DecodeHeader diesen Block änderst:

Code:
if EncodingFound then
begin
  encodingendpos:=PosIdx('?=', UpperCase(Header),encodingendpos+1); {Do not Localize}
  if encodingendpos > 0 then
  begin
    for i := LEncodingStartPos to encodingendpos-1 do begin
      //if CharIsInSet(Header, i, Whitespace) then begin      <-- diese Zeile
      if CharIsInSet(Header, i, [#9,#10,#13]) then begin      <-- durch diese ersetzen
        EncodingFound := false;
        break;
      end;
    end;
Dadrauf achten, dass du den Block mit dem "encodingendpos:=PosIdx('?=', UpperCase(Header),encodingendpos+1);" nimmst.
Da ist noch ein weiterer, der fast genauso aussieht.


Das Problem mit den UTF8 Subjects ist da nicht ganz so leicht zu lösen, da Indy hat der DecodeHeader stelle dort selber nichts vorsieht. Allerdings besitzt Indy eine Klasse um diese Strings (jedenfalls ohne den Header) zu decodieren.

Ich habe mir deswegen zwei Methoden gebaut:

Code:
function MailsGetSubject(Subject: String): String;
var
  Decoder        : TIdDecoderQuotedPrintable;
  TextAnsi       : String;
begin
  Result:=Subject;
  if Pos('=?utf-8',Subject)<>0 then
  begin
    Decoder:=TIdDecoderQuotedPrintable.Create;
    try
      Result:=DeleteUTF8ControlStrings(Subject);
      Result:=Decoder.DecodeString(Result);
      TextAnsi:=UTF8ToAnsi(Result);
      if Length(TextAnsi)>0 then Result:=TextAnsi;
    finally
      FreeAndNil(Decoder);
    end;
  end;
end;

function DeleteUTF8ControlStrings(Text: String): String;
var
  Encoded       : String;
  Dump          : String;
  StartPos      : Integer;
  EndPos        : Integer;
begin
  Encoded:='';
  Dump:=Text;
  while Pos('=?UTF-8',StrUpper(Dump))<>0 do
  begin
    StartPos:=Pos('=?UTF-8',StrUpper(Dump))+10;
    EndPos:=Pos('?=',StrUpper(Dump));
    Encoded:=Encoded+Copy(Dump,StartPos,EndPos-StartPos);
    Dump:=Encoded+Copy(Dump,EndPos+3,Length(Dump)-(EndPos+2));
  end;
  Result:=StrTrim(StrChangeCh(Encoded,'_',' '));
end;
Im Uses Block muss man dafür die Unit IdCoderQuotedPrintable zusätzlich einbinden.

Vielleicht hilfts ja wem ;)

Kleine Anmerkung:
DeleteUTF8ControlStrings löscht die =?utf-8?Q? und ?= Zeichen und baut auch mehrere zusammengesetzte utf8 codierte Strings wieder zu einem Zusammen. Dabei wird das ?Q? bzw ?B? ignoriert. ?B? bedeuted, dass das Subject noch zusätzlich Base64 Decodiert wird.

greetz
Steffen

Samashy 1. Mär 2006 10:57

Re: Indy und UTF-8 Betreff
 
Ich habe das mit dem ISO BUG versucht, aber bei erscheint es immernoch falsch...
=?ISO-8859-1?Q?K=FCndigungsr=FCcknahme_000,_AGENTUR_000000?=

Hast Du eine Idee? Der Rest funktioniert.

Romy

MasterEvil 1. Mär 2006 11:20

Re: Indy und UTF-8 Betreff
 
mhh, eigentlich sollte das gehn.

Hast du vielleicht doch das ganze im falschen Block ersetzt?
Da sind ja zwei Blöcke die sich nur um ein ? unterscheiden.

greetz
Steffen


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:39 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