Post by Jakob AchterndiekAm 12.08.2014, 15:12 Uhr, schrieb Hans-Peter Diettrich
Post by Hans-Peter DiettrichPost by Jakob AchterndiekPost by Hans-Peter DiettrichPost by Jakob AchterndiekMeine Vorstellung ist, daß es eine Routine geben müsse,
die einen Ansi-String aus dem Windows-Cache liest, ihn
in Utf-8-Code umwandelt und in den Cache zurückschreibt.
Welcher Cache?
Ich meinte: tClipboard.
Dann sag das doch einfach gleich ;-)
Schau mal in der Hilfe nach TClipboard und Get/SetTextBuf.
Der Algorithmus, mit dem ANSI in UTF-8 umgewandelt wird,
kann doch so schwierig nicht sein. Warum ist es so schwer,
dazu ein fehlerfreies Code-Beispiel in Delphi-5-tauglichem
Pascal zu finden? (Auch Martin Hentrichs Kunststückchen
war zwar amüsant, aber nicht hilfreich. ;) )
Versuchs mal damit:
// Assumes String = Ansistring, PChar = PAnsichar, that is: a
pre-Unicode Delphi version!
function AnsiToUTF8(const InStr: string): String;
var
LBuffer: PWidechar;
LRequired, LResult: Integer;
begin
LBuffer := 0;
LRequired:= MultibyteToWidechar(CP_ACP, 0, Pchar(InStr), -1, nil, 0);
if LRequired = 0 then
RaiseLastWin32Error;
GetMem(LBuffer, LRequired * Sizeof(Widechar));
try
LResult:= MultibyteToWidechar(CP_ACP, 0, Pchar(InStr), -1, LBuffer,
LRequired);
if LResult = 0 then
RaiseLastWin32Error;
LRequired:= WidecharToMultibyte(CP_UTF8, 0, LBuffer, -1, nil, 0,
nil, nil);
if LRequired = 0 then
RaiseLastWin32Error;
// LRequired includes the space for the #0 terminator, Delphi adds
that automatically
SetLength(Result, LRequired - 1);
LResult:= WidecharToMultibyte(CP_UTF8, 0, LBuffer, -1,
PChar(Result), LRequired, nil, nil);
if LResult = 0 then
RaiseLastWin32Error;
finally
FreeMem(LBuffer);
end;
end;
Ich habe Delphi 5 nicht mehr installiert, die analoge Routine unten
funktioniert aber in XE5 wie gewünscht.
function AnsiToUTF8(const InStr: Ansistring): AnsiString;
var
LBuffer: PWidechar;
LRequired, LResult: Integer;
begin
LBuffer := 0;
LRequired:= MultibyteToWidechar(CP_ACP, 0, PAnsichar(InStr), -1, nil,
0);
if LRequired = 0 then
RaiseLastWin32Error;
GetMem(LBuffer, LRequired * Sizeof(Widechar));
try
LResult:= MultibyteToWidechar(CP_ACP, 0, PAnsichar(InStr), -1,
LBuffer, LRequired);
if LResult = 0 then
RaiseLastWin32Error;
LRequired:= WidecharToMultibyte(CP_UTF8, 0, LBuffer, -1, nil, 0,
nil, nil);
if LRequired = 0 then
RaiseLastWin32Error;
// LRequired includes the space for the #0 terminator, Delphi adds
that automatically
SetLength(Result, LRequired - 1);
LResult:= WidecharToMultibyte(CP_UTF8, 0, LBuffer, -1,
PAnsiChar(Result), LRequired, nil, nil);
if LResult = 0 then
RaiseLastWin32Error;
finally
FreeMem(LBuffer);
end;
end;
--
Peter Below