Hallo Daniel,
ohne direkt auf
API-Calls zurück zu greifen kannst du die beiden String-Typen wechselseitig so interpretieren:
Delphi-Quellcode:
// Hallo Olli - sieht ähnlich aus wie bei dir in #34!
function StringAsWideString(s: string): WideString;
begin
SetLength(Result, Length(s) div SizeOf(WideChar));
Move(s[1], Result[1], Length(s));
end;
function WideStringAsString(ws: WideString): string;
begin
SetLength(Result, Length(ws) * SizeOf(WideChar));
Move(ws[1], Result[1], Length(Result));
end;
Weil bei jeder Delphi-Funktion, die mit
API String-Funktionen implementiert ist, bei NUL-Zeichen das Ende (C Konvention) eines Strings erkennt, ist tatsächlich der Weg über UTF-8 (das ist es was Bernhard dir mitteilen wollte) der schmerzfreiere:
Delphi-Quellcode:
var
s: string;
u: string;
ws: WideString;
begin
// to memphis
s := 'Der King läbt!';
u := AnsiToUtf8(s);
ws := Utf8Decode(u);
// and back
u := Utf8Encode(ws);
s := Utf8ToAnsi(u);
Hierbei treten keine Unverträglichkeiten auf.
Wenn du Strings in eine Datei schreibst, dann empfiehlt sich statt der Terminierung die vorgestellte Längenangabe. So können persistente Strings wesentlich effektiver verarbeitet werden.
Dein Thread ist etwas lang geraten und es kann sein, dass ich in der Mitte öfter den Faden verloren habe. Wegen etwaiger Redundanzen bitte nicht schimpfen.
Grüße vom marabu
PS: Bevor mein Beitrag völlig veraltet ist schicke ich ihn mal ab und lese dann den von Olli...