OK, du hast das Problem exakt eingekreist.
Ich habe aus Deinem Code folgenden Test-Code gemacht:
Code: Alles auswählen
procedure TForm1.Button2Click(Sender: TObject);
var
us1, us2:UTF8String;
ws1, ws2:WideString;
begin
us1:='öäü';
ws1:=UTF8Decode(us1);
ws2:=WideUpperCase(ws1);
us2:=UTF8Encode(ws2);
Memo1.Lines.Add('ws1 (' + inttostr(length(ws1)) + '):');
Memo1.Lines.Add(ws1);
dump(@ws1[1], 2*length(ws1));
Memo1.Lines.Add('ws2 (' + inttostr(length(ws2)) + '):');
Memo1.Lines.Add(ws2);
dump(@ws2[1], 2*length(ws2));
Memo1.Lines.Add(us2);
Memo1.Lines.Add('--------');
ws1:='öäü';
ws2:=WideUpperCase(ws1);
us2:=UTF8Encode(ws2);
Memo1.Lines.Add('ws1 (' + inttostr(length(ws1)) + '):');
Memo1.Lines.Add(ws1);
dump(@ws1[1], 2*length(ws1));
Memo1.Lines.Add('ws2 (' + inttostr(length(ws2)) + '):');
Memo1.Lines.Add(ws2);
dump(@ws2[1], 2*length(ws2));
Memo1.Lines.Add(us2);
end;
Ausgabe Lazarus:
Code: Alles auswählen
ws1 (3):
= #246 #0 #228 #0 #252 #0
= F6 00 E4 00 FC 00
ws2 (3):
= #214 #0 #196 #0 #220 #0
= D6 00 C4 00 DC 00
ÖÄÜ
--------
ws1 (6):
öäü
= #195 #0 #182 #0 #195 #0 #164 #0 #195 #0 #188 #0
= C3 00 B6 00 C3 00 A4 00 C3 00 BC 00
ws2 (6):
öäü
= #195 #0 #182 #0 #195 #0 #164 #0 #195 #0 #188 #0
= C3 00 B6 00 C3 00 A4 00 C3 00 BC 00
öäü
Ausgabe Turbo Delphi
Code: Alles auswählen
ws1 (0):
=
=
ws2 (0):
=
=
--------
ws1 (3):
öäü
= #246 #0 #228 #0 #252 #0
= F6 00 E4 00 FC 00
ws2 (3):
ÖÄÜ
= #214 #0 #196 #0 #220 #0
= D6 00 C4 00 DC 00
ÖÄÜ
Deine Idee, die String-Konstante mit UTF8Decode zu behandeln scheint also der Schlüssel des Problems zu sein.
Was hat Dich auf die Idee gebracht ? Die Sourcecode-Datei ist jedenfalls nicht als utf-8, sondern als UCS2 abgespeichert (BOM= FFFE). Ich bin deswegen da nicht d'rauf gekommen (und, weil ich eigentlich mit utf8 nichts zu tun haben will, wenn Lazarus intern oder in der OS-API utf8 benutzt, soll es mich gefälligst davon verschonen ! Die ekligen Windows-Handles versteckt es ja netterweise auch vor mir. )
Außerdem braucht TMemo.Lines.Add offensichtlich einen UTF8-String und interpretiert einen Widestring falsch.
Das ist insofern beruhigend, dass offensichtlich in Lazarus also doch mehr funktioniert, als ich befürchtet habe.
Allerdings sehe ich die Notwendigkeit, eine String-Konstante erst durch eine Funktion zu schicken, bevor sie einer Variablen zugeordnet wird als heftiges Manko. Wie Delphi das macht (die String-Konstante automatisch in den richtigen Widestring-Wert zu wandeln) kommt mir da sehr viel logischer/besser/benutzerfreundlicher vor.
Das TMemo.Lines.Add einen Widestring falsch interpretiert halte ich für einen Bug. Wenn die Umwwandlung nicht automatisch richtig passiert sollte es doch eine Variante für Widestring geben.
Warum verlässt Lazarus da den Kompatibilitäts-Pfad ? Wie der Test zeigt ist die Zuweisung Stringonstante->Widestring völlig inkompatibel. Die Variante mit utf8decode läuft
nur in Lazarus, die Variante ohne utf8decode läuft
nur in Turbo-Delphi.
-Michael