Anbei ein ganz simples Beispiel.
Dazu 2 exe Dateien von 2 verschiedenen Delphi XE4 Versionen.
Die Ausgabe von "testBase64Encode_fehler.exe" sieht wie ein
Unicode-Problem aus
Compiliert mit Delphi 11.0 scheint das Demo-Projekt erst einmal zu funktionieren, zumindest solange man sich bei der Eingabe auf den
ASCII-Zeichensatz beschränkt. Sobald deutsche Umlaute oder Sonderzeichen ins Spiel kommen, funktioniert der Code in BASE64Codec.pas nicht mehr wie erwartet, denn base64encode() verwendet einen AnsiString. Ich bekomme an dieser Stelle auch eine Compiler-Warnung:
"W1058 Implicit string cast with potential data loss from 'TCaption' to 'AnsiString'".
Base64 dient ja in erster Linie dazu, 8-Bit-Binärdateien (Bytes) in eine Zeichenfolge zu verwandeln, die nur aus lesbaren, Codepage-unabhängigen
ASCII-Zeichen besteht. Um einen String (also Text) in Base64 zu codieren, muss also zunächst der Text in Bytes umgewandelt werden; und genau dieser Schritt fehlt in der verwendeten
Unit BASE64Codec.pas. Die Historie in BASE64Codec.pas legt nahe, dass die letzten Änderungen/Anpassungen 2004 erfolgt sind; seit Delphi 2009 ist String aber WideString und der Code müsst angepasst werden. Evtl. liest Daniel hier ja mit und kann evtl. eine modernisierte Version zur Verfügung stellen.
Andererseits gibt es seit Delphi 10 die
RTL-
Unit System.NetEncoding.pas; dort gibt es die Klasse TBase64Encoding, die per class function verwendet werden kann und korrekte Ergebnisse liefert:
Edit2.Text := TNetEncoding.Base64.Encode(Edit1.Text);
HTH
Achim