[gelöst] Umlaute in Variable und Bildschirm
- juelin
- Beiträge: 243
- Registriert: Sa 24. Jul 2021, 18:03
- OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
- CPU-Target: 64Bit
- Wohnort: Mannheim
[gelöst] Umlaute in Variable und Bildschirm
Hallo zusammen,
wahrscheinlich ist die Frage schon tausendmal gestellt worden.
Ich frage trotzdem nochmal.
Wenn ich in Windows Daten aus der Datenbank in eine Varibale vom Typ string lese
und iese variaable auf dem Bildschirm ausgebe under String enthält Umlaute
so habe ich folgendes Problem.
Der Umlaut in der Variablen belegt 2 Byte (da Lazarus UTF8 hat).
Auf dem Bildschirm belegt der Umlaut natülich nur 1 Byte.
Die Ausgabe soll aber Formatiert sein, d.h. alle Werte untereinander stehen.
Variable1 = abcdef (wird auf Länge 10 mit Blanks vergrößert) in Zeile 1
Variable1 = äbcdef (wird auf Länge 10 mit Blanks vergrößert) in zeile 2
Variable2 = 1234
Weil ich den Inalt der Variablen so verlängere, dass sie sie Maximalgröße haben.
Beispiel: Varibale1:=Variable1+' ';
Ausgabe dann z. B. Listbox1.Itents.Add(Variable1+' '+Variable2);
Die Ausgabe am Bildschirm sieht aber so aus (wegen des Umlautes in Zeile 2)
Zeile 1 = abcdef 1234
Zeile 2 = äbcdef 1234
Gibt es da eine einfache Lösung zum Problem?
Danke und Gruß
Jürgen
wahrscheinlich ist die Frage schon tausendmal gestellt worden.
Ich frage trotzdem nochmal.
Wenn ich in Windows Daten aus der Datenbank in eine Varibale vom Typ string lese
und iese variaable auf dem Bildschirm ausgebe under String enthält Umlaute
so habe ich folgendes Problem.
Der Umlaut in der Variablen belegt 2 Byte (da Lazarus UTF8 hat).
Auf dem Bildschirm belegt der Umlaut natülich nur 1 Byte.
Die Ausgabe soll aber Formatiert sein, d.h. alle Werte untereinander stehen.
Variable1 = abcdef (wird auf Länge 10 mit Blanks vergrößert) in Zeile 1
Variable1 = äbcdef (wird auf Länge 10 mit Blanks vergrößert) in zeile 2
Variable2 = 1234
Weil ich den Inalt der Variablen so verlängere, dass sie sie Maximalgröße haben.
Beispiel: Varibale1:=Variable1+' ';
Ausgabe dann z. B. Listbox1.Itents.Add(Variable1+' '+Variable2);
Die Ausgabe am Bildschirm sieht aber so aus (wegen des Umlautes in Zeile 2)
Zeile 1 = abcdef 1234
Zeile 2 = äbcdef 1234
Gibt es da eine einfache Lösung zum Problem?
Danke und Gruß
Jürgen
Zuletzt geändert von juelin am So 4. Mai 2025, 16:27, insgesamt 2-mal geändert.
Re: Umlaute in Variable und Bildschirm
Du zeigst nicht, was du machst. Deshalb kann ich nur vermuten:
UTF8PadRight in LazUTF8.
https://dsiders.gitlab.io/lazdocsnext/l ... right.html
UTF8PadRight in LazUTF8.
https://dsiders.gitlab.io/lazdocsnext/l ... right.html
- juelin
- Beiträge: 243
- Registriert: Sa 24. Jul 2021, 18:03
- OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
- CPU-Target: 64Bit
- Wohnort: Mannheim
Re: Umlaute in Variable und Bildschirm
theo, habe geändert im Original.
Gruß
Jürgen
Gruß
Jürgen
- juelin
- Beiträge: 243
- Registriert: Sa 24. Jul 2021, 18:03
- OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
- CPU-Target: 64Bit
- Wohnort: Mannheim
Re: Umlaute in Variable und Bildschirm
hi,
ich habe natülich auch schon eine Lösung,
aber die ist meiner Mainung nach zu umständlich.
Ich Frage den numerischen Code der Zeichen im String ab.
Umlaute haben ja 2 Byte und fangen immer mit 195 im ersten Byte an.
Gruß
Jürgen
ich habe natülich auch schon eine Lösung,
aber die ist meiner Mainung nach zu umständlich.
Ich Frage den numerischen Code der Zeichen im String ab.
Umlaute haben ja 2 Byte und fangen immer mit 195 im ersten Byte an.
Gruß
Jürgen
Code: Alles auswählen
procedure TForm1.UTF8pruef(TextVar: string);
var
stelle: integer;
lang: integer;
wert1: integer;
wert2: integer;
begin
Umlaute:=0;
lang:=Length(TextVar);
if lang > 0 then
begin
for stelle:=1 to lang do
begin
wert1:=Ord(TextVar[stelle]);
if stelle < lang then
begin
wert2:=Ord(TextVar[stelle+1]);
if wert1 = 194 then
begin
if wert2 = 167 then Umlaute:=Umlaute+1;
if wert2 = 176 then Umlaute:=Umlaute+1;
if wert2 = 180 then Umlaute:=Umlaute+1;
end;
if wert1 = 195 then
begin
if wert2 = 132 then Umlaute:=Umlaute+1;
if wert2 = 150 then Umlaute:=Umlaute+1;
if wert2 = 156 then Umlaute:=Umlaute+1;
if wert2 = 159 then Umlaute:=Umlaute+1;
if wert2 = 164 then Umlaute:=Umlaute+1;
if wert2 = 182 then Umlaute:=Umlaute+1;
if wert2 = 188 then Umlaute:=Umlaute+1;
end;
end;
end;
end;
end;
Re: Umlaute in Variable und Bildschirm
Wie gesagt: UTF8PadRight ist die Lösung.
Code: Alles auswählen
ListBox1.Items.add(UTF8PadRight('äbcdef',10)+'1234');
ListBox1.Items.add(UTF8PadRight('abcdef',10)+'1234');
- Ally
- Beiträge: 279
- Registriert: Do 11. Jun 2009, 09:25
- OS, Lazarus, FPC: Win und Lazarus Stable release
- CPU-Target: x64
Re: Umlaute in Variable und Bildschirm
Hallo Jürgen,
du hast geschrieben:
Ich bin da auch nicht so der Experte und nutze deshalb gerne die UTF8-Funktionen die Lazarus so bietet.
Eine hat theo ja schon genannt, viele weitere findest du unter https://lazarus-ccr.sourceforge.io/docs ... dex-5.html
Das Ganze wird aber sowieso nur mit proportionalen Schriften wie z.B. Courier funktionieren.
Bei nichtproportionalen Schriften wie z.B. Arial kommt es dann je nach Inhalt, immer noch zu Verschiebungen.
Viele Grüße
Roland
du hast geschrieben:
Damit du da nicht allzu viel Arbeit investierst, UTF8-Zeichen können bis zu vier Byte lang sein. (siehe https://de.wikipedia.org/wiki/UTF-8)Umlaute haben ja 2 Byte und fangen immer mit 195 im ersten Byte an.
Ich bin da auch nicht so der Experte und nutze deshalb gerne die UTF8-Funktionen die Lazarus so bietet.
Eine hat theo ja schon genannt, viele weitere findest du unter https://lazarus-ccr.sourceforge.io/docs ... dex-5.html
Das Ganze wird aber sowieso nur mit proportionalen Schriften wie z.B. Courier funktionieren.
Bei nichtproportionalen Schriften wie z.B. Arial kommt es dann je nach Inhalt, immer noch zu Verschiebungen.
Viele Grüße
Roland
Re: Umlaute in Variable und Bildschirm
Das stimmt natürlich, lässt sich aber in einer Listbox kaum verhindern.Ally hat geschrieben: So 4. Mai 2025, 12:28 Das Ganze wird aber sowieso nur mit proportionalen Schriften wie z.B. Courier funktionieren.
Bei nichtproportionalen Schriften wie z.B. Arial kommt es dann je nach Inhalt, immer noch zu Verschiebungen.
Ein Grid wäre hier wahrscheinlich sowieso geeigneter. Z.B. TStringGrid.
- juelin
- Beiträge: 243
- Registriert: Sa 24. Jul 2021, 18:03
- OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
- CPU-Target: 64Bit
- Wohnort: Mannheim
Re: Umlaute in Variable und Bildschirm
Hallo Theo,
danke für den Hinweis.
Frage noch: was für ein Package muss man in USES einfügen für UTF8PadRight?
Danke und Gruß
Jürgen
danke für den Hinweis.
Frage noch: was für ein Package muss man in USES einfügen für UTF8PadRight?
Danke und Gruß
Jürgen
Re: Umlaute in Variable und Bildschirm
A
Sonst steht es auch noch in der verlinkten Doku.
Und wenn ich es nicht angegeben hätte, könntest du die IDE danach suchen lassen. Den Begriff in den Code schreiben -> Kompilieren -> Rechtsklick auf der Fehlermeldung im Nachrichtenfenster -> "Suche Bezeichner".
Habe ich doch oben geschrieben, in der ersten Antwort (Es ist übrigens eine Unit, kein Package).juelin hat geschrieben: So 4. Mai 2025, 14:29 Frage noch: was für ein Package muss man in USES einfügen für UTF8PadRight?
Sonst steht es auch noch in der verlinkten Doku.
Und wenn ich es nicht angegeben hätte, könntest du die IDE danach suchen lassen. Den Begriff in den Code schreiben -> Kompilieren -> Rechtsklick auf der Fehlermeldung im Nachrichtenfenster -> "Suche Bezeichner".
- juelin
- Beiträge: 243
- Registriert: Sa 24. Jul 2021, 18:03
- OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
- CPU-Target: 64Bit
- Wohnort: Mannheim
Re: Umlaute in Variable und Bildschirm
Hallo Theo,
ja danke es funktioniert einwandfrei.
Meine Lösung klappt zwar auch, ist aber nicht so schön.
Nochmals Danke und Gruß
Jürgen
ja danke es funktioniert einwandfrei.
Meine Lösung klappt zwar auch, ist aber nicht so schön.
Nochmals Danke und Gruß
Jürgen