Unicode-Zeichen in TLabel.Caption
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: Unicode-Zeichen in TLabel.Caption
Hi!
Nun nötigt ihr noch n alten Mann zu Windows.
Anbei ein (vergrößerter) Schreenshot mit Super- und Subscript unter Windows7.
Ich weiß nicht, wo Eure Probleme liegen.
Oder ist das wieder einmal ein Win10/Win11-Problem?
Winni
Nun nötigt ihr noch n alten Mann zu Windows.
Anbei ein (vergrößerter) Schreenshot mit Super- und Subscript unter Windows7.
Ich weiß nicht, wo Eure Probleme liegen.
Oder ist das wieder einmal ein Win10/Win11-Problem?
Winni
- Dateianhänge
-
- Sub_Sup_Win.png (128.49 KiB) 1240 mal betrachtet
-
- Beiträge: 958
- Registriert: Mi 3. Jun 2020, 07:18
- OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
- CPU-Target: Aarch64 bis Z80 ;)
- Wohnort: München
Re: Unicode-Zeichen in TLabel.Caption
Ich hab's jetzt nicht ausprobiert, aber wahrscheinlich ist es folgendes: in deinem ersten Beispiel wird der String zur Laufzeit erzeugt, da ja ein Funktionsaufruf vorhanden ist (für diesen Punkt ist es nicht relevant, ob inline oder nicht). Die Lazarus IDE nutzt ja UTF-8, also wird auch ein entsprechender UTF-8 String zur Laufzeit erzeugt.Socke hat geschrieben: Fr 6. Mai 2022, 18:48 Bei der Gelegenheit könnte mit bitte jemand erklären, warum das Konstrukt oben funktioniert, ein direkter Typecast aber nicht. Ich versteh das nicht - sollte doch äquivalent sein?!Code: Alles auswählen
Label1.Caption := Unicodechar($03C3)+'_M'; // erzeugt ?_M
Im zweiten Beispiel wird der String zur Kompilierzeit erzeugt, FPC hat in dem Fall aber keine Ahnung, dass es UTF-8 ist (dazu muss entweder explizit $codepage utf8 genutzt werden oder die Datei eine UTF-8 BOM haben) und nimmt daher die Standardcogepage an, wofür es keine gültige Umwandung für $03C3 gibt. Daher das Fragezeichen.
FPC Compiler Entwickler
- Jorg3000
- Lazarusforum e. V.
- Beiträge: 374
- Registriert: So 10. Okt 2021, 10:24
- OS, Lazarus, FPC: Win64
- Wohnort: NRW
Re: Unicode-Zeichen in TLabel.Caption
Hi!
Wenn UnicodeChar() verwendet wird, sollte es einem WideString/UnicodeString zugewiesen werden, damit kein Datenschwund eintritt.
Und da die Caption irgendeinen AnsiString erwartet, muss der UnicodeString zunächst in 8-Bit kodiert werden, wie im Folgenden z.B. in UTF-8.
Dann klappt's ...
Grüße, Jörg
Code: Alles auswählen
Label1.Caption := UnicodeChar($03C3)+'_M'; // erzeugt ?_M
Und da die Caption irgendeinen AnsiString erwartet, muss der UnicodeString zunächst in 8-Bit kodiert werden, wie im Folgenden z.B. in UTF-8.
Dann klappt's ...
Code: Alles auswählen
Label1.Caption := Utf8Encode( UnicodeChar($03C3)+'_M' ); // erzeugt σ_M
-
- Beiträge: 6923
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Unicode-Zeichen in TLabel.Caption
Da gehen echt lustige Sachen, ob es mit Windows geht, keine Ahnung.
Code: Alles auswählen
procedure TForm1.FormCreate(Sender: TObject);
begin
Caption:='❤️🧡💛💚💙💜🖤🤎';
end;
- Dateianhänge
-
- Bildschirmfoto vom 2022-05-09 23-24-24.png (5.66 KiB) 1203 mal betrachtet
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Unicode-Zeichen in TLabel.Caption
Der Compiler fügt die Konvertierungen automatisch ein; er sagt nur nicht, welche Ziel-Codepage er verwendet und normalerweise informiert er darüber.Jorg3000 hat geschrieben: Mo 9. Mai 2022, 22:12 Und da die Caption irgendeinen AnsiString erwartet, muss der UnicodeString zunächst in 8-Bit kodiert werden, wie im Folgenden z.B. in UTF-8.
Dann klappt's ...
Ich habe aber die Vermutung, dass der Compiler die Konvertierung bereits selbst durchführt und sich dabei in der Kodierung vergreift. Ich hab da nochmal die effektiv verwendeten Codepages im Debugging verglichen:
Code: Alles auswählen
var
uS: UnicodeString;
begin
uS := UnicodeChar($03C3)+'_M';
Label1.Caption := us; // implizite Konvertierung von UnicodeString in einen AnsiString mit CodePage UTF-8
Label1.Caption := UnicodeChar($03C3)+'_M'; // erzeugt einen AnsiString mit Codepage CP_ACP
end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 958
- Registriert: Mi 3. Jun 2020, 07:18
- OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
- CPU-Target: Aarch64 bis Z80 ;)
- Wohnort: München
Re: Unicode-Zeichen in TLabel.Caption
Weil der Compiler keine Ahnung hat, dass zur Laufzeit die Codepage auf UTF-8 gesetzt wird (das macht nämlich die LCL während der Initialisierung). Untypisierte Stringkonstanten sind immer in CP_ACP und wenn die CodePage zur Kompilierzeit nicht mit der CodePage zur Laufzeit übereinstimmt dann hast du eben Buchstabensalat.Socke hat geschrieben: Di 10. Mai 2022, 08:46 Dass ich das Verhalten mit {$codepage UTF-8} lösen kann, ist mir bewusst. Warum aber wird bei Konstanten eine andere Ziel-Codepage ausgewählt?
FPC Compiler Entwickler
Re: Unicode-Zeichen in TLabel.Caption
Das mit den automatischen Umwandlungen bzw Codepages ist schon ein ziemlicher PITA (Was ich schon immer befürchtet hatte).
Ich hatte hier so einen Fall und mir ist das alles bis heute nicht ganz geheuer.
https://gitlab.com/freepascal.org/fpc/s ... sues/39554
Mich deucht, noch nicht einmal die FPC Entwickler sind mit der Problematik richtig vertraut.
Für den Normalo ist es schwierig zu durchschauen.
Ich hatte hier so einen Fall und mir ist das alles bis heute nicht ganz geheuer.
https://gitlab.com/freepascal.org/fpc/s ... sues/39554
Mich deucht, noch nicht einmal die FPC Entwickler sind mit der Problematik richtig vertraut.
Für den Normalo ist es schwierig zu durchschauen.