ich wollte einen String aus einem TEdit in seine Hex Repräsentation auf einem TLabel (Lbl) wandeln lassen. Aber UTF8CharacterToUnicode liefert mir bei einem ä nur E4 und nicht den vollen Codepoint. Was mache ich falsch? Ich habe mich an http://wiki.lazarus.freepascal.org/LCL_ ... rToUnicode orientiert. Meine Compiler Version ist Lazarus 1.1 und fpc 2.7.1 .
procedure TMainForm.EditChange(Sender: TObject);
var p : PChar;
t,
h : String;
c : cardinal;
l : Integer;
begin
p := pChar(Edit.Text);
t := '';
while p > '' do
begin
c := UTF8CharacterToUnicode(p, l);
inc(p, l);
h := IntToHex(c, 2);
if odd(length(h)) then
h := '0' + h;
t := t + h + ' ';
end;
Lbl.Caption := Copy(t, 1, length(t) - 1);
end;
procedure TMainForm.EditChange(Sender: TObject);
var p : PChar;
t : String;
l,
i : Integer;
begin
p := pChar(Edit.Text);
t := '';
while p > '' do
begin
l := UTF8CharacterLength(p);
for i := 1 to l do
begin
t := t + IntToHex(ord(p[0]), 2);
inc(p);
end;
t := t + ' ';
end;
Lbl.Caption := Copy(t, 1, length(t) - 1);
end;
Ich glaube, du bist verwirrt.
Ich weiss jetzt auch nicht genau, wo's bei dir hakt, aber die Fkt. sind beide einwandfrei afaics.
Die eine gibt den Code Point in Unicode (UTF-16) zurück, die andere in UTF-8 Kodierung.
Beides afaics vom Resultat her richtig.
Ja. Unicode verwirrt mich tatsächlich. Ist Unicode immer UTF16? Oder ist Unicode ein Oberbegriff für UTF16, UTF8 und was es sonst noch so gibt? Ich wollte ein Abbild des UTF8 Strings aus dem Speicher haben. Wenn UTF8CharacterToUnicode UTF16 liefert, ist das natürlich nicht das, was ich wollte. Und ich finde, da passiert unheimlich viel unnötiges hin und her gerechne.
Lazarus (die Schnittstelle des User-Programms zur LCL) verwendet momentan UTF-8 (weil Linux das i.a. verwendet), Delphi verwendet (durchgängig, seit 2005 oder so) UTF-16 (bzw. UCS-2) (weil Windows das verwendet).
Ob Lazarus und FPC (u.a. wegen der Delphi-Kompatibilität, aber vielleicht auch weil die Missverständnisse besser verdeckt werden) auf 16-Bit Code umschwenken, wird in den Entwickler-Foren diskutiert.
MSDIDE (eine IDE und Bibliothek, die ebenfalls auf FPC basiert) verwendet ebenfalls 16 Bit Character-Code.