Thema: Delphi Indy und UTF-8 Betreff

Einzelnen Beitrag anzeigen

Benutzerbild von MasterEvil
MasterEvil

Registriert seit: 12. Feb 2005
Ort: Hannover
234 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Indy und UTF-8 Betreff

  Alt 28. Feb 2006, 11:40
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
  Mit Zitat antworten Zitat