Discussion:
ansi to utf-8
(zu alt für eine Antwort)
Jakob Achterndiek
2014-08-12 10:15:18 UTC
Permalink
Hallo,

da meine bisherigen Versuche erfolglos waren, erlaub ich
mir diese zweite Anfrage.

Meine 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.
Die sollte bitte auch irgendwie in ein mit Delphi 5 prof
geschriebenes Programm zu implementieren sein.
Meine Frage und Bitte:
Weiß jemand unter Euch so eine Routine und wo ich die
bekommen kann? Gibt es vielleicht einen frei verfügbaren
Quellcode dafür? So schrecklich geheim dürfte das ja
wohl nicht sein.

Gruß
j/\a
--
Martin Hentrich
2014-08-12 10:33:48 UTC
Permalink
On Tue, 12 Aug 2014 12:15:18 +0200, "Jakob Achterndiek"
Post by Jakob Achterndiek
Weiß jemand unter Euch so eine Routine und wo ich die
bekommen kann? Gibt es vielleicht einen frei verfügbaren
Quellcode dafür? So schrecklich geheim dürfte das ja
wohl nicht sein.
Schrecklich?

http://bit.ly/1sQKXY6

Martin

SCNR
--
Sie müssen sich keine Notizen machen. Wenn etwas
wichtig ist, werden Sie sich daran erinnern.
[Steve Jobs]
Hans-Peter Diettrich
2014-08-12 10:33:42 UTC
Permalink
Post by Jakob Achterndiek
Meine 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?

DoDi
Jakob Achterndiek
2014-08-12 12:53:25 UTC
Permalink
Am 12.08.2014, 12:33 Uhr, schrieb Hans-Peter Diettrich
Post by Hans-Peter Diettrich
Post by Jakob Achterndiek
Meine 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.

j/\a
--
Hans-Peter Diettrich
2014-08-12 13:12:12 UTC
Permalink
Post by Jakob Achterndiek
Am 12.08.2014, 12:33 Uhr, schrieb Hans-Peter Diettrich
Post by Hans-Peter Diettrich
Post by Jakob Achterndiek
Meine 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.

Das Clipboard kann gleichzeitig mehrere Formate enthalten, z.B. CF_TEXT
und CF_UNICODETEXT, und wandelt ggf. auch automatisch zwischen diesen
Formaten. Falls sich das Clipboard nur CF_UNICODETEXT merkt, kann das
Schreiben von CF_TEXT mit was anderem als der Default-Codepage Murks
ergeben - muttu selber ausprobieren.

Es ist zwar möglich, ein spezielles Clipboard-Format für UTF-8 zu
definieren, das dann (ziemlich sicher) nicht konvertiert wird, aber dann
muß die Anwendung, die anschließend den Text aus dem Clipboard holen
soll, auch genau dieses Format anfordern, und nicht nur CF_TEXT bzw.
CF_UNICODETEXT. Da kommt es also drauf an, ob Dein eigenes Programm
dieses Format vorgeben kann, oder ob ein fremdes Programm nur nach
CF_TEXT bzw. CF_UNICODETEXT schaut.

DoDi
Jakob Achterndiek
2014-08-12 16:26:31 UTC
Permalink
Am 12.08.2014, 15:12 Uhr, schrieb Hans-Peter Diettrich
Post by Hans-Peter Diettrich
Post by Jakob Achterndiek
Post by Hans-Peter Diettrich
Post by Jakob Achterndiek
Meine 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.
Wir mißverstehen uns. Deshalb noch einmal Klartext:
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. ;) )

j/\a
--
Martin Hentrich
2014-08-12 18:53:20 UTC
Permalink
On Tue, 12 Aug 2014 18:26:31 +0200, "Jakob Achterndiek"
Post by Jakob Achterndiek
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. ;) )
Hilft ggf.:

http://www.yunqa.de/delphi/doku.php/products/tntunicodecontrols/index

Version 2.1.22 Last Delphi 5 version.

Martin
--
Sie müssen sich keine Notizen machen. Wenn etwas
wichtig ist, werden Sie sich daran erinnern.
[Steve Jobs]
Hans-Peter Diettrich
2014-08-12 19:38:48 UTC
Permalink
Post by Jakob Achterndiek
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. ;) )
Ich bin schon gespannt, was als nächstes kommt ;-)

Schau mal bei FreePascal nach. Alternativ kann auch MultiByteToWideChar
(und umgekehrt) verwendet werden, wenn man die Windows-Codepage von
UTF-8 weiß (CP_UTF8=65001).

DoDi
Lothar Planitzer
2014-08-12 21:02:22 UTC
Permalink
Post by Jakob Achterndiek
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. ;) )
Es ist überhaupt nicht schwer, Code-Beispiele zu finden. Gerade Martins
'Kunststückchen' zeigt, dass im Netz jede Menge Beispiele zu finden sind, u. a.
folgendes:

<snip>

procedure Ansi2Unicode(s: string; var WStr: WideString; CP: UINT);
var sz: integer;
begin
sz := MultiByteToWideChar(CP, 0, PChar(s), -1, nil, 0);
setlength(WStr, sz * 2);
MultiByteToWideChar(CP, 0, PChar(s), -1, PWidechar(WStr), sz);
end;

procedure Unicode2Ansi(WStr: WideString; var s: string; CP: UINT);
var sz: integer;
begin
sz := WideCharToMultiByte(CP, 0, PWidechar(WStr), -1,
nil, 0, nil, nil);
setlength(s, sz);
WideCharToMultiByte(CP, 0, PWidechar(WStr), -1, PChar(s),
sz, nil, nil);
end;



function Ansi2UTF8(s: string): string;
var WStr: WideString;
begin
Ansi2Unicode(s, WStr, CP_ACP);
Unicode2Ansi(WStr, Result, CP_UTF8);
end;

function UTF82Ansi(s: string): string;
var WStr: WideString;
begin
Ansi2Unicode(s, WStr, CP_UTF8);
Unicode2Ansi(WStr, Result, CP_ACP);
end;

</snip>

Läuft unter Delphi >= 4
Es gibt sicher noch jede Menge andere Beispiele, die womöglich effektiver und
performanter sind.
Wie man mit einer Suchmaschine umgeht, sollte eigentlich bekannt sein.

Gruß Lothar
Jakob Achterndiek
2014-08-12 21:20:49 UTC
Permalink
Am 12.08.2014, 23:02 Uhr, schrieb Lothar Planitzer
Post by Lothar Planitzer
Es ist überhaupt nicht schwer, Code-Beispiele zu finden. Gerade Martins
'Kunststückchen' zeigt, dass im Netz jede Menge Beispiele zu finden
<snip>
procedure Ansi2Unicode(s: string; var WStr: WideString; CP: UINT);
var sz: integer;
[..]
Danke.
Vielleicht ist die nächste Frage ja wirklich blöd:
Wo liegen - bzw. woher nehme ich - die CodePages, auf die da
Bezug genommen wird?

j/\a
--
Lothar Planitzer
2014-08-12 21:30:42 UTC
Permalink
Post by Jakob Achterndiek
Wo liegen - bzw. woher nehme ich - die CodePages, auf die da
Bezug genommen wird?
hier steht alles:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd374130%28v=vs.85%29.aspx

Kleiner Tipp (auch) von mir: Google existiert! :-)


Gruß Lothar
Peter
2014-08-13 09:26:21 UTC
Permalink
Post by Jakob Achterndiek
Am 12.08.2014, 15:12 Uhr, schrieb Hans-Peter Diettrich
Post by Hans-Peter Diettrich
Post by Jakob Achterndiek
Post by Hans-Peter Diettrich
Post by Jakob Achterndiek
Meine 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
Jakob Achterndiek
2014-08-13 12:04:18 UTC
Permalink
Post by Peter
[..] Warum ist es so schwer,
dazu ein fehlerfreies Code-Beispiel in Delphi-5-tauglichem
Pascal zu finden?
[..]
Ich habe Delphi 5 nicht mehr installiert, die analoge Routine
unten funktioniert aber in XE5 wie gewünscht.
Verbindlichen Dank!
Beide Routinen laufen in einem Erprobungsprogramm bei mir mit
erfreulichem Erfolg. Jetzt muß ich eine davon nur noch in mein
umfangreiches Datenbank-Ausgabeprogramm einbauen.

Falls von den bisherigen Beiträgern jemand wissen möchte, um
welche Art Projekt es überhaupt geht: Einen Ausschnitt zeigt
<http://www.Buzemann.de/publ/bau01.htm>

Freundliche Grüße
j/\a
--

Lesen Sie weiter auf narkive:
Loading...