Problem mit dem Zeichensatz

Rund um die LCL und andere Komponenten
Antworten
braunbär
Beiträge: 462
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
CPU-Target: 64Bit
Wohnort: Wien

Problem mit dem Zeichensatz

Beitrag von braunbär »

Dass die unterschiedlichen Zeichensätze immer wieder gerne Probleme bereiten, ist ja bekannt.
Neu ist für mich, dass innerhalb von Lazarus derartige Probleme auftreten können, und ich habe keine Idee, wo ich den Fehler suchen könnte.

Code: Alles auswählen

procedure debug(const txt: string);
const
  SB_BOTTOM=7;
  First: Boolean = True;
  InDebug: boolean=False;
var
  f: text;
begin
  if not DebugOn then exit;
  frmMain.LogBox.Items.add(txt);
 ....

Code: Alles auswählen

debug('GetMemberlist Query für Set '+Setname+', SetNr: '+inttostr(SetNr));
Und heraus kommt:
Bild

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6661
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Problem mit dem Zeichensatz

Beitrag von af0815 »

braunbär hat geschrieben: Mo 3. Feb 2025, 20:43

Code: Alles auswählen

debug('GetMemberlist Query für Set '+Setname+', SetNr: '+inttostr(SetNr));
Tja und mit welchem Zeichensatz ist das in der Datenbank gespeichert (Setname). Meistens das Problem das in der DB irgend ein WIN Zeichensatz verwendet wird und in Lazarus UTF8. Jetzt hängt es von den Verbindungsschicht (SQLDB oder ZEOS) ab, ob man das in der Verbindung konvertiert, oder gleich am Server richtig macht, oder im Programm konvertieren muß.

Bei Lazarus würde ich in der DB bei der Erstellung der Tabellen immer UTF8 angeben.

https://mariadb.com/kb/en/setting-chara ... ollations/
Prior to MariaDB 11.6.0, the default character set is latin1 and the default collation is latin1_swedish_ci. From MariaDB 11.6, the default character set is utf8mb4 and the default collation is utf8mb4_uca1400_ai_ci. This may differ in some distros, see for example Differences in MariaDB in Debian.
So kann es passieren, das du im Programm mit UTF8 arbeitest, vom Server aber Latin1 schwedische Ausprägung kommt :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

braunbär
Beiträge: 462
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
CPU-Target: 64Bit
Wohnort: Wien

Re: Problem mit dem Zeichensatz

Beitrag von braunbär »

Das "für" und der ganze String, der falsch angezeigt wird, kommt ja nicht aus der Datenbank, es ist Teil der Stringkonstante

Code: Alles auswählen

'GetMemberlist Query für Set '
, die an Debug als Parameter übergeben und beim Erstellen des Source Codes in Lazarus richtig angezeigt wird.
Der String Setname ist auch nicht in der Datenbank gespeichert, sondern kommt genauso von Konstanten im Pascal Source Code.
Zuletzt geändert von braunbär am Di 4. Feb 2025, 15:21, insgesamt 2-mal geändert.

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

Re: Problem mit dem Zeichensatz

Beitrag von theo »

Keine Ahnung, hast du was verstellt?
Check mal: Rechtsklick auf dem Editor -> Dateieinstellungen -> Zeichenkodierung. Da sollte UTF-8 stehen
Oder bei der Listbox das Font.Charset. Auf Linux spielt das zwar keine Rolle, aber vilt. auf Win, das weiss ich nicht.

braunbär
Beiträge: 462
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
CPU-Target: 64Bit
Wohnort: Wien

Re: Problem mit dem Zeichensatz

Beitrag von braunbär »

Ich bin mir zumindest nicht bewußt, irgendwas an den Einstellungen in dem Bereich verändert zu haben. Die Zeichenkodierung der Datei ist UTF-8, Der Zeichensatz des Listbox-Fonts ist DEFAULT_CHARSET.

PS.: In einem TLabel, dessen Caption ebenfalls von einer Stringkonstante zur Laufzeit generiert wird, kommen die Umlaute richtig an.

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

Re: Problem mit dem Zeichensatz

Beitrag von theo »

Hmm. also wenn du ein neues Projekt machst nur mit einer Listbox und das Gleiche da reinschreibst und und das Problem wieder auftritt, dann würde ich einen Bug-Report machen.
Vorausgesetzt du hast eine aktuelle Version.
Auf Linux tritt das Problem vermutlich nicht auf?

braunbär
Beiträge: 462
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
CPU-Target: 64Bit
Wohnort: Wien

Re: Problem mit dem Zeichensatz

Beitrag von braunbär »

theo hat geschrieben: Di 4. Feb 2025, 15:02 Keine Ahnung, hast du was verstellt?
Check mal: Rechtsklick auf dem Editor -> Dateieinstellungen -> Zeichenkodierung. Da sollte UTF-8 stehen
Oder bei der Listbox das Font.Charset. Auf Linux spielt das zwar keine Rolle, aber vilt. auf Win, das weiss ich nicht.
Du hast Recht.
Jetzt habe ich noch einmal geschaut: Alle anderen Units haben die Zeichenkodierung UTF-8, aber die eine Unit, in der der Debug Aufruf steht, hatte die Kodierung CP1252. Ich verstehe nicht wie, weil ich habe an der Zeichenkodierung sicher nichts gefummelt, ich wusste gar nicht, dass es das Kontextmenü gibt.
Danke, es hätte mich viel Zeit gekostet, da selbst draufzukommen.

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

Re: Problem mit dem Zeichensatz

Beitrag von Jorg3000 »

PS: Meine folgende Antwort hat sich zeitlich überschnitten mit der vorherigen Antwort, wo CP1252 gefunden wurde.

Hi!
Kommt denn Setname aus einer Datenbank und hat womöglich eine andere Codepage als UTF-8?
Ich glaube, FreePascal stolpert beim Verbinden zweier Strings mit unterschiedlicher CodePage, also bei: 'GetMemberlist Query für Set '+Setname.

Teste mal folgendes ...

Code: Alles auswählen

debug( UTF8Encde( 'GetMemberlist Query für Set '+UnicodeString(Setname)+', SetNr: '+inttostr(SetNr)) );
Grüße, Jörg

braunbär
Beiträge: 462
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
CPU-Target: 64Bit
Wohnort: Wien

Re: Problem mit dem Zeichensatz

Beitrag von braunbär »

Jorg3000 hat geschrieben: Di 4. Feb 2025, 16:25 Kommt denn Setname aus einer Datenbank und hat womöglich eine andere Codepage als UTF-8?
Ich glaube, FreePascal stolpert beim Verbinden zweier Strings mit unterschiedlicher CodePage, also bei: 'GetMemberlist Query für Set '+Setname.
Unabhängig davon, dass der Fehler ein anderer war, aus Interesse - Speichert denn das Laufzeitsystem überhaupt die Codepage eines Strings? Ich dachte, ein String ist nur eine Folge von Bytes, die entsprechend der im Kontext aktuellen Codepage interpretiert werden.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6661
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Problem mit dem Zeichensatz

Beitrag von af0815 »

braunbär hat geschrieben: Di 4. Feb 2025, 21:39 Unabhängig davon, dass der Fehler ein anderer war, aus Interesse - Speichert denn das Laufzeitsystem überhaupt die Codepage eines Strings? Ich dachte, ein String ist nur eine Folge von Bytes, die entsprechend der im Kontext aktuellen Codepage interpretiert werden.
Nein, mittlerweile werden bei Strings eben die Codierung und auch Referenzzähler mitgeführt. Ausserdem sind es bei UTF-x Bytefolgen die es zu interprtieren gibt. UTF-8, UTF-16, UCS-2,... verhalten sich da unterschiedlich. UTF-8 kann Bytefolgen bis zu 4 haben. Strings sind ziemlich schwer verständliche Dinger mit sehr viel eigenleben, wenn man es nicht kapiert hat (ich hab es noch immer nicht ganz drauf)

https://wiki.freepascal.org/String_Encoding/de
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

braunbär
Beiträge: 462
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
CPU-Target: 64Bit
Wohnort: Wien

Re: Problem mit dem Zeichensatz

Beitrag von braunbär »

Ok, danke. Zumindest bin ich jetzt gewarnt :D

Antworten