Ich könnte auch meine Hand dafür ins feuer legen, dass insert eine Funktion gewesen ist und keine Procedure

Die Frage ist für mich damit geklärt

Dann empfehle ich dir eine gute Brandsalbepluto hat geschrieben: Ich könnte auch meine Hand dafür ins feuer legen, dass insert eine Funktion gewesen ist und keine Procedure![]()
Wenn Du mit "Mutter" Source-Datei meinst, ist da auch nichts gegen einzuwenden. UTF8 ist natürlich das kompakteste Format zur Speicherung von Unicode in Dateien. Zum Programmieren ist aber vermutlich in den meisten Fällen UTCS2 (was für alle meine zukünftigen Anwendungen UTD16 entspricht) ("Widestring" in FPC) praktischer und schneller.theo hat geschrieben:Das kann evtl. schon sein, zeigt aber nur wieder, dass unter FPC UTF-8 die Mutter von allem Unicode ist.
Wenn das automatisch geht (wie ei FPC in standardeinstellung) ist da auch nichts gegen einzuwenden.theo hat geschrieben:D.h. WideString (UCS-2, UTF-16) bedarf immer einer Konvertierung, sonst kann es der FPC gar nicht lesen.
Martin, Danke, dass Du das für mich herausgesucht hast, Ich hätte es erst heute machen können.mse hat geschrieben:Hier nochmals die Erklärung von Jonas Maebe in fpc-devel:...
Ich hoffe, ich habe die angesprochenen Phänomene inzwischen (u.a. mit Deiner Hilfe, nach einigen Irrungen und Wirrungen) richtig verstanden.mse hat geschrieben:Das heisst, wenn der Quellcode beispielsweise in utf-8 abgespeichert ist und dem compiler dies mittels -Fcutf8 oder BOM mitgeteilt wird, werden zur Compilezeit string Konstanten, die Codepoints > 127 enthalten, in widestring gewandelt und als widestring ins exe eingebaut....So, dies war nun aber das letzte mal...
Code: Alles auswählen
var
ws: WideString;
begin
ws := 'äöü123';
...
Code: Alles auswählen
var
ws: WideString;
begin
ws := utf8decode('äöü123'); //oder wie auch immer man einen korrekt Uniciode kodierten WideString erzeugt
Form1.Caption := ws; // oder wie auch immer man Wondow-Captions in MSEIDE anspreicht
Code: Alles auswählen
var
us: UTF8String;
begin
us := utf8encode('äöü123'); //oder wie auch immer man einen korrekt Uniciode kodierten UTF8String erzeugt
Form1.Caption := us; // oder wie auch immer man Wondow-Captions in MSEIDE anspreicht
Das sehe ich auch so, und deine Versuche und die Erfahrungen, die russisch sprachige Anwender mit der neuen Lazarus Version machen, bestätigen den Sachverhalt.mschnell hat geschrieben:
Es läuft doch darauf hinaus, dass bei Benutzung von Lazarus, wenn man ein neues Projekt anlegt, ohne dass man die default-Compiler-Einstellungen ändert, die Anweisungen (die jeder nicht speziell auf das Problem hingewiesene so schreiben würde):zu einem nicht wie erwartet Unicode kodierten WideString führen.Code: Alles auswählen
var ws: WideString; begin ws := 'äöü123'; ...
Wenn aber jemand nun inbedingnt mit UTF8 arbeiten möchte und schreibt:geht das vermutlich auch mit MSIEID schief. Oder ?Code: Alles auswählen
var us: UTF8String; begin us := utf8encode('äöü123'); //oder wie auch immer man einen korrekt Uniciode kodierten UTF8String erzeugt Form1.Caption := us; // oder wie auch immer man Wondow-Captions in MSEIDE anspreicht
Code: Alles auswählen
us := utf8encode('äöü123'); //oder wie auch immer man einen korrekt Uniciode kodierten UTF8String erzeugt
Code: Alles auswählen
Form1.Caption := us; // oder wie auch immer man Wondow-Captions in MSEIDE anspreicht
Code: Alles auswählen
Form1.Caption := utf8decode(us); // oder wie auch immer man Wondow-Captions in MSEIDE anspreicht
Ich vermute, die FPC-Macher haben gedacht, bei Unicode sollte man mit Widestrings arbeiten und somit den Compiler auf Widestrings optimiert. Die Lazarus-Macher dagegen (miss-)brauchen FPC zut bearbeitung von UTF8, obwohl der arme Compiler den Typ UTF8String garnicht wirklich kennt, sondern ihm der TYP AnsiString vorgegaukelt wird und da nun mal zufällig UTF8Subcodes statt ANSI-Character drin gespeichert sind.mse hat geschrieben:funktioniert, 'äöü123' wird zur Kompilierzeit korrekt in widestring gewandelt und zur Laufzeit korrekt von widestring in utf-8.
Klar, weil der Compiler UFT7String garnicht kennt und nicht weiß dass er das Unicode-Mäßig in den WideString (den caption:= ...; erwartet) konvertieren soll. Er macht dann vermutlich eine Konvertierung ANSIString (entsprechend der Systemcodierung) zu Widestring, was natürlich zu Blödsinn führt.mse hat geschrieben:funktioniert nur, wenn die Systemcodierung utf-8 ist, da MSEgui widestring erwartet und zur Wandlung von UTF8String (=ansistring) in widestring zur Laufzeit die Systemcodierung verwendet wird, also funktioniert es in der Regel unter Windows nicht.Code: Alles auswählen
Form1.Caption := us; // oder wie auch immer man Wondow-Captions in MSEIDE anspreicht
Die Zeile müsste für MSEgui folgendermassen geschrieben werden:
Code: Alles auswählen
Form1.Caption := utf8decode(us); // oder wie auch immer man Wondow-Captions in MSEIDE anspreicht
Oder Lazarus auf widestring umstellen oder MSEide+MSEgui benutzen.mschnell hat geschrieben:Die einzige Rettung ist, dem Compiler den Type UTF8String beizubringen.
Bzw. dem AnsiString Codepages, wie beim neuen Delphi:mschnell hat geschrieben: Die einzige Rettung ist, dem Compiler den Type UTF8String beizubringen.
Nö, Auch dann würden nicht alle Zuweisungenmse hat geschrieben:Oder Lazarus auf widestring umstellen
Code: Alles auswählen
WideString := UTF8String;
WideString := ANSIString;
UTF8String := WideString;
UTF8String := ANSIString;
ANSIString := WideAString;
ANSIString :) UTF8String;
mse hat geschrieben:oder MSEide+MSEgui benutzen.
ANSI-Strings benutzten (bei Delphi, vermutlich auch bei FPC) immer schon implizit die im System eingestellte Codepage. Jedenfalls arbeiteten doch uppercase und genossen korrekt.theo hat geschrieben:Bzw. dem AnsiString Codepages, wie beim neuen Delphi:
Es geht aber darum, dass ein AnsiString sich seine codepage "merken" kann. Das kann auch UTF8 sein.mschnell hat geschrieben:ANSI-Strings benutzten (bei Delphi, vermutlich auch bei FPC) immer schon implizit die im System eingestellte Codepage.
Das hatte ich schon verstanden. Kommt mit aber ziemlich abstrus vor. Welchen Codierungs-Typ hat dann s1 := s2 ? Oder s := ws (WideString) ?theo hat geschrieben:Es geht aber darum, dass ein AnsiString sich seine codepage "merken" kann.
UTF8 ist natürlich keine Codepage, aber wenn der Stringtyp sich seine Codierung merken kann, ist das eine sinnvolle Erweiterung.theo hat geschrieben:Das kann auch UTF8 sein.
Ersteres wahrsch. Default (System Encoding), zweiteres wenn S Ansistring ist: UTF-8. Was sonst?mschnell hat geschrieben:Das hatte ich schon verstanden. Kommt mit aber ziemlich abstrus vor. Welchen Codierungs-Typ hat dann s1 := s2 ? Oder s := ws (WideString) ?
Naja, "65001 is the code page number for UTF-8 on the Windows platform"mschnell hat geschrieben: UTF8 ist natürlich keine Codepage, aber wenn der Stringtyp sich seine Codierung merken kann, ist das eine sinnvolle Erweiterung.