Unicode-Zeichen in TLabel.Caption

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Benutzeravatar
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

Beitrag von Winni »

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
Dateianhänge
Sub_Sup_Win.png
Sub_Sup_Win.png (128.49 KiB) 1015 mal betrachtet

PascalDragon
Beiträge: 825
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

Beitrag von PascalDragon »

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
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.
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

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 168
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Unicode-Zeichen in TLabel.Caption

Beitrag von Jorg3000 »

Hi!

Code: Alles auswählen

Label1.Caption := UnicodeChar($03C3)+'_M';  // erzeugt ?_M
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 ...

Code: Alles auswählen

Label1.Caption := Utf8Encode( UnicodeChar($03C3)+'_M' );  // erzeugt σ_M
Grüße, Jörg

Mathias
Beiträge: 6165
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

Beitrag von Mathias »

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
Bildschirmfoto vom 2022-05-09 23-24-24.png (5.66 KiB) 978 mal betrachtet
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Socke
Lazarusforum e. V.
Beiträge: 3158
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

Beitrag von Socke »

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 ...
Der Compiler fügt die Konvertierungen automatisch ein; er sagt nur nicht, welche Ziel-Codepage er verwendet und normalerweise informiert er darüber.

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;
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?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

PascalDragon
Beiträge: 825
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

Beitrag von PascalDragon »

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?
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.
FPC Compiler Entwickler

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

Re: Unicode-Zeichen in TLabel.Caption

Beitrag von theo »

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.

Antworten