Unicode: Knopf in der Leitung

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
theo
Beiträge: 10950
Registriert: Mo 11. Sep 2006, 19:01

Unicode: Knopf in der Leitung

Beitrag von theo »

Was kommt hierbei raus?

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var s:AnsiSTring;
w:WideString;
i:integer;
begin
 s:='ä';
 Writeln('Len s ',Length(s));
 for i:=1 to Length(s) do writeln(Ord(s[i]));
 writeln('-');
 w:=s;
 Writeln('Len w ',Length(w));
 for i:=1 to Length(w) do writeln(Hi(Word(w[i])),' ',Lo(Word(w[i])));
end;
Klar, das "ä" liegt in UTF-8 vor und der AnsiString besteht daher aus 2 Zeichen.
Also oben:

Len s 2
195
164

Und so ist das auch.

Diese werden nun Zeichenweise in den WideString kopiert, und dann kommt unten einfach das raus:

Len w 2
0 195
0 164

Denkste!

Das kommt raus:

Len w 1
0 228

(Linux de_CH.UTF-8)

Wird also doch Implizit umgewandelt?
Ich versteh langsam gar nix mehr...

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: Unicode: Knopf in der Leitung

Beitrag von monta »

Ich wart die ganze Zeit, das die Lazarusfee kommt, mir über den Kopf streicht und sagt "Du musst Unicode nicht verstehen zum programmieren" :lol:
Johannes

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Unicode: Knopf in der Leitung

Beitrag von mse »

theo hat geschrieben: (Linux de_CH.UTF-8)

Wird also doch Implizit umgewandelt?
Ich versteh langsam gar nix mehr...
Ehem... ;-)

Wird zur Laufzeit ein AnsiString einem Widestring zugewiesen, wird mittels des WidestringManagers von der Systemcodierung in utf-16 gewandelt. Du kannst das sehr schön sehen, wenn du bei der Zuweisung mit F7 in den FPC code hineinstepst. Bitte lies nochmals die verschiedenen Beiträge, die ich darüber geschrieben habe. :-)

Martin

Benutzeravatar
theo
Beiträge: 10950
Registriert: Mo 11. Sep 2006, 19:01

Re: Unicode: Knopf in der Leitung

Beitrag von theo »

mse hat geschrieben: Wird zur Laufzeit ein AnsiString einem Widestring zugewiesen, wird mittels des WidestringManagers von der Systemcodierung in utf-16 gewandelt.
OK, Danke. Das hatte ich nicht mehr auf dem Radar.
Das dürfte dann aber auf Windows so nicht klappen, wenn der String als UTF-8 vorliegt und die Systemcodierung nicht UTF-8 ist, richtig?

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Unicode: Knopf in der Leitung

Beitrag von mse »

theo hat geschrieben: Das dürfte dann aber auf Windows so nicht klappen, wenn der String als UTF-8 vorliegt und die Systemcodierung nicht UTF-8 ist, richtig?
Genau. Und das ist auch ein Grund, warum ich die Lazarus Methode nicht für optimal halte. Darüber schreibe ich nun aber nichts mehr. :-)

Martin

Benutzeravatar
theo
Beiträge: 10950
Registriert: Mo 11. Sep 2006, 19:01

Re: Unicode: Knopf in der Leitung

Beitrag von theo »

mse hat geschrieben: Genau. Und das ist auch ein Grund, warum ich die Lazarus Methode nicht für optimal halte. Darüber schreibe ich nun aber nichts mehr. :-)
Ja, das ist natürlich verwirrend und eine gute Fehlerquelle.
Kann man diesen Automatismus im FPC ausschalten, sodass einfach immer explizit umgewandelt werden muss?
Immerhin könnte man so Überraschungen vermeiden.

Irgendwie hatte ich im Hinterkopf, dass du einmal gesagt hast, man müsse diese Funktionalität ausdrücklich einschalten.
Deshalb auch meine ursprüngliche Annahme.

EDIT: Nö, Sorry, da hatte ich was verwechselt. Ich meinte -Fcutf8, das hat damit aber nichts zu tun

Benutzeravatar
theo
Beiträge: 10950
Registriert: Mo 11. Sep 2006, 19:01

Re: Unicode: Knopf in der Leitung

Beitrag von theo »

monta hat geschrieben:Ich wart die ganze Zeit, das die Lazarusfee kommt, mir über den Kopf streicht und sagt "Du musst Unicode nicht verstehen zum programmieren" :lol:
Einfach nur immer ae,oe,ue und ss schreiben, dann bist du fein raus! ;-)
Aber ich glaube das Thema sorgt allgemein für einiges Kopfzerbrechen. Auch bei Florian u.a. und CodeGear hat sich damit auch nicht leicht getan.
Du bist wenigstens nicht allein damit. ;-)

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Unicode: Knopf in der Leitung

Beitrag von mse »

theo hat geschrieben: Kann man diesen Automatismus im FPC ausschalten, sodass einfach immer explizit umgewandelt werden muss?
Du meinst dass der Compiler Zuweisungen von AnsiString zu WideString verbietet? Dies ist so viel ich weiss nicht möglich.

Benutzeravatar
theo
Beiträge: 10950
Registriert: Mo 11. Sep 2006, 19:01

Re: Unicode: Knopf in der Leitung

Beitrag von theo »

mse hat geschrieben: Du meinst dass der Compiler Zuweisungen von AnsiString zu WideString verbietet? Dies ist so viel ich weiss nicht möglich.
Nicht die Zuweisung an sich, aber so, dass sie sich nach meiner ersten Annahme verhält, also dass die Chars (Bytes) einfach auf WideChar (Word) aufgeblasen werden, was dann auch der Latin1 Variante entprechen würde, wenn ich das richtig verstehe. Also keine automatische Codepage bzw. UTF-8 Konversion.
Damit würde man unter Linux mit Lazarus wenigstens nicht Code schreiben können, der dann auf Windows nicht funzt.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Unicode: Knopf in der Leitung

Beitrag von mse »

theo hat geschrieben: Nicht die Zuweisung an sich, aber so, dass sie sich nach meiner ersten Annahme verhält, also dass die Chars (Bytes) einfach auf WideChar (Word) aufgeblasen werden.
Das geht, wenn du einen eigenen Widestring Manager registrierst. Der default WideStringManager tut genau das.
Mit

Code: Alles auswählen

 
 widestringmanager.Wide2AnsiMoveProc:=@defaultWide2AnsiMove;
 widestringmanager.Ansi2WideMoveProc:=@defaultAnsi2WideMove;
 
kann die Einstellung, die cwstring vorgenommen hat, rückgängig gemacht werden.

Benutzeravatar
theo
Beiträge: 10950
Registriert: Mo 11. Sep 2006, 19:01

Re: Unicode: Knopf in der Leitung

Beitrag von theo »

mse hat geschrieben: Das geht, wenn du einen eigenen Widestring Manager registrierst.
Interessant, Danke. Vielleicht sollte man den Default Manager für Lazarus verwenden.

Antworten