![]() |
UTF ä und ß hintereinander , ß wird nicht encoded
Ich erhalte eine Email mit einem UTF codierten Betreff: '=?UTF-8?Q?Planm=C3=A4=C3=9Fige_Erh=C3=B6hung_xx-xx-xx?=
Code:
Ich entferne die UTF ControllStrings und benutze dann TIdDecoderQuotedPrintable
while Pos('=?UTF-8',Dump)<>0 do
begin StartPos:=Pos('=?UTF-8',Dump)+10; EndPos:=PosEx('?=',Dump,startpos+10); Encoded:=Encoded+Copy(Dump,StartPos,EndPos-StartPos); Dump:=Encoded+Copy(Dump,EndPos+3,Length(Dump)-(EndPos+2)); end; Result:=Encoded;
Code:
Ergebnis: Decoder :=TIdDecoderQuotedPrintable.Create; versuch1:=Decoder.DecodeString(TRIM(betreff)); ergebnis:=UTF8ToWideString(versuch1); versuch1 = 'PlanmäÃ'#$009F'ige_Erhöhung_xx-xx-xx' ergebnis = 'Planmä�?ige_Erhöhung_xx-xx-xx' Was mache ich falsch? ß wird einfach nicht gewandelt, obwohl es meiner Meinung nach richtig geliefert wird. (=C3=9F) |
AW: UTF ä und ß hintereinander , ß wird nicht encoded
Hallo,
was passiert, wenn Du das ä mal wegläßt. Und wie hast Du die einzelnen String-Variablen definiert (welcher Typ genau)? |
AW: UTF ä und ß hintereinander , ß wird nicht encoded
Man sollte das entsprechende RFC Dokument lesen. Dort wird dann alles erklärt.
![]() Es gibt auch einen ![]()
Code:
herauskommen sollte
=?UTF-8?Q?Planm=C3=A4=C3=9Fige_Erh=C3=B6hung_xx-xx-xx?=
Code:
Planmäßige Erhöhung xx-xx-xx
|
AW: UTF ä und ß hintereinander , ß wird nicht encoded
Hallo,
das löst doch aber nicht das Problem des TE? Wo ist denn die Antwort auf seine Frage? PS: Ich persönlich finde die RFC's einfach nur schrecklich zu lesen. |
AW: UTF ä und ß hintereinander , ß wird nicht encoded
Zitat:
Delphi-Quellcode:
Decoder := TIdDecoderQuotedPrintable.Create;
versuch1:= Decoder.DecodeString(TRIM(betreff), IndyTextEncoding_UTF8); |
AW: UTF ä und ß hintereinander , ß wird nicht encoded
@hoika
Nun ja, wer die RFCs liest, der bekommt z.B. mit, dass dieser Text folgende Bedeutung hat:
Code:
Da fest vorauszusetzen, dass es sich beim Charset immer um UTF-8 handelt oder beim Encoding immer um QuotedPrintable, ist halt ein vorprogrammierter Knieschuss.
=?<charset>?<encoding>?<encoded-text>?=
Des weiteren wird bei QuotedPrintable im Header ein Leerzeichen durch =20 ersetzt oder durch den Unterstrich _. Damit hat man sozusagen alles zusammen um das Problem mit ein paar Zeilen universal zu lösen. |
AW: UTF ä und ß hintereinander , ß wird nicht encoded
Hallo,
du meinst also, dass zwar UTF8 im Betreff drinsteht, es aber selbst kein UTF8 ist. |
AW: UTF ä und ß hintereinander , ß wird nicht encoded
Nun, ich würde sagen, dass bei dieser Mail
Zitat:
Und bei der nächsten Mail? Die kann mit irgendeinem Charset und Base64 kodiert sein.
Code:
Natürlich kann ich das jetzt falsch verstanden haben und der TE will ein Programm schreiben, das nur diese eine Mail bearbeiten wird. Dann hättest du natürlich Recht.
From: =?US-ASCII?Q?Keith_Moore?= <moore@cs.utk.edu>
To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@dkuug.dk> CC: =?ISO-8859-1?Q?Andr=E9?= Pirard <PIRARD@vm1.ulg.ac.be> Subject: =?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?= =?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?= |
AW: UTF ä und ß hintereinander , ß wird nicht encoded
Zitat:
Danke für die schnellen Hinweise von allen hier. |
AW: UTF ä und ß hintereinander , ß wird nicht encoded
Zitat:
Hab vielen Dank für Deinen Lösungsweg, werde ich beherzigen. |
AW: UTF ä und ß hintereinander , ß wird nicht encoded
Jupp, so dachte man sich das zu AnsiString-Zeiten auch - bis Unicode kam und das Geschrei darüber man bis heute noch hören kann.
Eventuell hilft es ja
Delphi-Quellcode:
program Rfc2047;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.StrUtils, IdException, IdGlobal, IdCharsets, IdCoder, IdCoderQuotedPrintable, IdCoderMIME; function Decode( const AStr: string; AIsHeader: Boolean = false ): string; function TryDecode( const encoded_str: string; out decoded_text: string ): Boolean; var parts: TArray<string>; charset, coding, encoded_text: string; encoding: IIdTextEncoding; coder: TIdDecoder; coderclass: TIdDecoderClass; begin parts := encoded_str.Split( ['?'] ); if Length( parts ) <> 3 then begin Exit( false ); end; charset := parts[0]; coding := parts[1].ToLowerInvariant( ); encoded_text := parts[2]; try encoding := IndyTextEncoding( charset ); except on E: EIdException do begin Exit( false ) end; end; if coding = 'q' then begin coderclass := IdCoderQuotedPrintable.TIdDecoderQuotedPrintable; if AIsHeader then encoded_text := encoded_text.Replace( '_', ' ' ); end else if coding = 'b' then begin coderclass := IdCoderMIME.TIdDecoderMIME; end else begin Exit( false ); end; decoded_text := coderclass.DecodeString( encoded_text, encoding ); Result := True; end; var idx: Integer; sp, ep: Integer; str: string; begin idx := 0; Result := AStr; while True do begin sp := Result.IndexOf( '=?', idx ); if sp < 0 then break; ep := Result.IndexOf( '?=', sp + 2 ); if ep < 0 then break; if TryDecode( Result.Substring( sp + 2, ep - ( sp + 2 ) ), str ) then Result := Result.Substring( 0, sp ) + str + Result.Substring( ep + 2 ) else idx := ep + 2; end; end; begin try Writeln( Decode( 'Subject: =?iso-8859-1?q?this=20is=20some=20text?= =?UTF-8?Q?Planm=C3=A4=C3=9Fige_Erh=C3=B6hung_xx-xx-xx?=', True ) ); except on E: Exception do Writeln( E.ClassName, ': ', E.Message ); end; Readln; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz