Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Umlaute in UTF8: Äthiopien statt Äthiopien (https://www.delphipraxis.net/168946-umlaute-utf8-%E3%84thiopien-statt-aethiopien.html)

Perlsau 20. Jun 2012 08:11

Datenbank: Firebird • Version: 2.5 • Zugriff über: FibPlus 6.9.6 Release for 2009

Umlaute in UTF8: Äthiopien statt Äthiopien
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Firebird-Spezialisten,

in meiner Datenbank sind alle VarChars, Chars und Text-Blobs mit UTF8 codiert. Die Darstellung in DB-Grid in meiner Delphi-Form ist nicht zu beanstanden, alles korrekt, auch die Umlaute – bis auf eine Sache, für die ich ein klein wenig ausholen muß:

Es gibt zwei Tabellen:
Code:
CREATE TABLE LAND (
    IDX_LAND INTEGER NOT NULL,
    LAND     VARCHAR(100) DEFAULT '_Unbekannt' NOT NULL,
    ISOCODE  VARCHAR(2),
    VORWAHL  VARCHAR(10),
    KFZ      VARCHAR(3)
);
und
Code:
CREATE TABLE WAEHRUNG (
    IDX_WAEHRUNG INTEGER NOT NULL,
    NAME         VARCHAR(100) DEFAULT '_Unbekannt' NOT NULL,
    SUB_NAME     VARCHAR(20),
    EINTEILUNG   INTEGER,
    KUERZEL      VARCHAR(10),
    ZEICHEN      CHAR(1),
    LAND         INTEGER DEFAULT 0 NOT NULL,
    W_KURS       NUMERIC(15,5) DEFAULT 0 NOT NULL,
    KURS_DATUM   DATE,
    ISO_4217     VARCHAR(3),
    AKTUELL      FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT DEFAULT 0 NOT NULL CHECK (VALUE IN (0,1)) */,
    BESCHREIBUNG BLOB SUB_TYPE 0 SEGMENT SIZE 80
);
Um in meinem DB-Grid die Tabelle Währung inkl. des mit der Tabelle Land verknüpften Feldes Land anzeigen zu lassen, habe ich im Währungs-Dataset ein Lookup-Feld erstellt. Nun werden Umlaute in diesem Lookup-Feld nicht richtig dargestellt. Mir ist nicht ganz klar, ob das an der Datenbank, an der Zugriffskomponente oder an meiner geringen Erfahrung mit Unicode liegt (ich würde ja mal spontan auf Letzteres tippen ...).

ChrisE 20. Jun 2012 08:38

AW: Umlaute in UTF8: Äthiopien statt Äthiopien
 
Hallo,

wenn ich nicht ganz falsch bin, kann man in UTF8 das Ä in zwei weisen darstellen. Es gibt einmal das Ä und einmal ein A mit dem Folgezeichen "zwei Hochpunkte". Aber das nur am Rande.

Hast du schon mal versucht mit einem anderen Programm auf die Datenbank zu zugreifen - z.B. IBExpert o.ä.? Zeigen diese es auch so an? Die DB is ja wie Papier - also geduldig :-) Sprich, wenn du rein schreibst und ausließt können sich Unicode-Probleme kompensieren.

Und wie sieht die Deklaration der Default-Chars in Create-Script der Datenbank aus?

Evtl. musst du aber auch irgendwo bei den Delphi-Komponenten explizit sagen, dass es sich um eine UTF8-Kodierte DB handelt.

Das alles nur mal so ins blaue.

Gruß, Chris

Perlsau 20. Jun 2012 08:59

AW: Umlaute in UTF8: Äthiopien statt Äthiopien
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von ChrisE (Beitrag 1171686)
Hallo,

wenn ich nicht ganz falsch bin, kann man in UTF8 das Ä in zwei weisen darstellen. Es gibt einmal das Ä und einmal ein A mit dem Folgezeichen "zwei Hochpunkte". Aber das nur am Rande.

Moin Chris, das wußte ich als Unicode-Anfänger natürlich noch nicht. Danke. :thumb:

Zitat:

Zitat von ChrisE (Beitrag 1171686)
Hast du schon mal versucht mit einem anderen Programm auf die Datenbank zu zugreifen - z.B. IBExpert o.ä.? Zeigen diese es auch so an? Die DB is ja wie Papier - also geduldig :-) Sprich, wenn du rein schreibst und ausließt können sich Unicode-Probleme kompensieren.

IBExpert zeigt alles einwandfrei an. Auch ein TDBGrid zeigt die Länder einwandfrei an. Nur beim Abfragen via Lookupfeld werden Umlaute falsch dargestellt, wie du am Bild im Eingangspost sehen kannst.

Zitat:

Zitat von ChrisE (Beitrag 1171686)
Und wie sieht die Deklaration der Default-Chars in Create-Script der Datenbank aus?

Zeichensatz = UTF8 / Schriftart = DEFAULT_CHARSET
Auch bei Schriftart = ANSI_CHARSET stimmt die Darstellung im Lookup-Feld nicht.

Zitat:

Zitat von ChrisE (Beitrag 1171686)
Evtl. musst du aber auch irgendwo bei den Delphi-Komponenten explizit sagen, dass es sich um eine UTF8-Kodierte DB handelt.

Aber ja, das ist von Anfang an gesetzt:
Delphi-Quellcode:
DB_Main.ConnectParams.CharSet := 'UTF8';
Die Länder werde im Länder-Grid korrekt angezeigt, wie du unten in der Grafik sehen kannst.

Naja, vielleicht komm ich ja noch drauf im Laufe des Tages ... :roll:

DeddyH 20. Jun 2012 09:01

AW: Umlaute in UTF8: Äthiopien statt Äthiopien
 
Bemerkenswerter finde ich, dass die Darstellung in der Auswahlliste der ComboBox richtig ist, im Editfeld hingegen falsch :gruebel:

Perlsau 20. Jun 2012 09:03

AW: Umlaute in UTF8: Äthiopien statt Äthiopien
 
Zitat:

Zitat von DeddyH (Beitrag 1171697)
Bemerkenswerter finde ich, dass die Darstellung in der Auswahlliste der ComboBox richtig ist, im Editfeld hingegen falsch :gruebel:

Das ist es in der Tat ... :?

Auch mit anderen Sonderzeichen: Aus Costa-Rica-Colón wird Costa-Rica-Colón

DeddyH 20. Jun 2012 09:23

AW: Umlaute in UTF8: Äthiopien statt Äthiopien
 
Für mich sieht das nach einem Bug in TDBLookupCombobox aus. Möglicherweise existiert dazu bereits ein QC-Eintrag, müsste man mal recherchieren.

Perlsau 20. Jun 2012 09:36

AW: Umlaute in UTF8: Äthiopien statt Äthiopien
 
Zitat:

Zitat von DeddyH (Beitrag 1171702)
Für mich sieht das nach einem Bug in TDBLookupCombobox aus. Möglicherweise existiert dazu bereits ein QC-Eintrag, müsste man mal recherchieren.

Ich hab jetzt mal eine TDBLookupCombobox auf die Form gelegt (einmal TJvDBLookupCombo, dann noch mit TDBLookupComboBox versucht) und die Darstellung ist korrekt, beim Auswählen in der Drop-Down-Liste wie auch im Textfeld.

Auch hab ich das Jedi-DB-Grid gegen das Originale von Delphi ausgetauscht, ohne daß das Problem behoben wäre.

Mist, immer klemmt's irgendwo :(

DeddyH 20. Jun 2012 09:40

AW: Umlaute in UTF8: Äthiopien statt Äthiopien
 
Zitat:

Zitat von Perlsau (Beitrag 1171706)
... und die Darstellung ist korrekt, beim Auswählen in der Drop-Down-Liste wie auch im Textfeld.

Auch hab ich das Jedi-DB-Grid gegen das Originale von Delphi ausgetauscht, ohne daß das Problem behoben wäre.

Da komme ich gerade nicht mit, ist das Problem nun behoben oder nicht. Außerdem: war das auf dem Screenshot nun eine Standard-DBLookupComboBox oder eine JEDI-Komponente? Wenn Letzteres, wird man wohl auch keinen QC-Eintrag finden.

ChrisE 20. Jun 2012 09:45

AW: Umlaute in UTF8: Äthiopien statt Äthiopien
 
Hallo,

ganz kurzer Blick in eine UTF8-Tabelle zeigt, dass normalerweise ein großes Ä mit Hex c384 codiert wird. In ANSI ist Hex c3 -> Ã und Hex 84 -> „

Ich gehe also davon aus, dass es in der DB richtig ist und nicht richtig umgewandelt wird.

Gruß, Chris

Perlsau 20. Jun 2012 09:46

AW: Umlaute in UTF8: Äthiopien statt Äthiopien
 
Zitat:

Zitat von DeddyH (Beitrag 1171709)
Zitat:

Zitat von Perlsau (Beitrag 1171706)
... und die Darstellung ist korrekt, beim Auswählen in der Drop-Down-Liste wie auch im Textfeld. Auch hab ich das Jedi-DB-Grid gegen das Originale von Delphi ausgetauscht, ohne daß das Problem behoben wäre.

Da komme ich gerade nicht mit, ist das Problem nun behoben oder nicht. Außerdem: war das auf dem Screenshot nun eine Standard-DBLookupComboBox oder eine JEDI-Komponente? Wenn Letzteres, wird man wohl auch keinen QC-Eintrag finden.

Vielleicht erkennt man es ja nicht gleich auf Anhieb, aber das erste Bild, das ich oben zeige, stellt die LookUp-Combo eines DB-Grid dar. Im Textfeld des DB-Grid (in der entsprechenden Zelle) wird das Land nicht korrekt dargestelt, in der Drop-Down-Liste des DB-Grid-Lookup-Feldes aber schon – egal ob Jedi- oder Original-Komponente.

Im Stand-Alone-TDBLookUpCombo dagegen wird alles richtig angezeigt, egal ob Jedi- oder Original-Komponente.

Jetzt alle Klarheiten beseitigt :wink:

Perlsau 20. Jun 2012 09:49

AW: Umlaute in UTF8: Äthiopien statt Äthiopien
 
Zitat:

Zitat von ChrisE (Beitrag 1171710)
Hallo, ganz kurzer Blick in eine UTF8-Tabelle zeigt, dass normalerweise ein großes Ä mit Hex c384 codiert wird. In ANSI ist Hex c3 -> Ã und Hex 84 -> „
Ich gehe also davon aus, dass es in der DB richtig ist und nicht richtig umgewandelt wird.

Okay, irgendwo wird da nicht richtig umgewandelt. In den Cellen der DBGrids ist aber alles okay, nur in der DropDownListe des DBGrid-Lookup-Feldes nicht. Was muß ich anhand der von dir geposteten wertvollen Erkenntnis :lol: also tun, um das Problem zu beheben?

DeddyH 20. Jun 2012 09:50

AW: Umlaute in UTF8: Äthiopien statt Äthiopien
 
Achsooo, ich hatte das für eine DBLookupCombobox gehalten.

Perlsau 20. Jun 2012 09:54

AW: Umlaute in UTF8: Äthiopien statt Äthiopien
 
Zitat:

Zitat von DeddyH (Beitrag 1171713)
Achsooo, ich hatte das für eine DBLookupCombobox gehalten.

Das war ein Irrtum, den ich wohl durch meine nachlässige Darstellung provoziert habe :?

Das DBLookUpCombo hab ich erst später draufgeschmissen, nachdem du gemeint hattest, es sähe "nach einem Bug in TDBLookupCombobox aus".

ChrisE 20. Jun 2012 09:55

AW: Umlaute in UTF8: Äthiopien statt Äthiopien
 
Zitat:

Zitat von Perlsau (Beitrag 1171712)
Okay, irgendwo wird da nicht richtig umgewandelt. In den Cellen der DBGrids ist aber alles okay, nur in der DropDownListe des DBGrid-Lookup-Feldes nicht. Was muß ich anhand der von dir geposteten wertvollen Erkenntnis :lol: also tun, um das Problem zu beheben?

Ich hoffe doch, dass es eine sehr Wertvolle Erkenntnis ist 8-):lol: , denn es bedeutet ja, dass der Fehler vermutlich in der DropDownListe der DBGrid-Lookup-Feldes liegt :-) Es sollte keine Fehlerbehebeung sein, es ist mehr als Sicherheit zu verstehen wo der Fehler höchst wahrscheinlich liegt.

Zitat:

Zitat von Perlsau (Beitrag 1171712)
Mir ist nicht ganz klar, ob das an der Datenbank, an der Zugriffskomponente oder an meiner geringen Erfahrung mit Unicode liegt (ich würde ja mal spontan auf Letzteres tippen ...).

Gruß, Chris

Perlsau 20. Jun 2012 10:12

AW: Umlaute in UTF8: Äthiopien statt Äthiopien
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Perlsau (Beitrag 1171678)
... Nun werden Umlaute in diesem Lookup-Feld nicht richtig dargestellt ...

HEUREKA!
Problem gelöst!!! :-D:-D:-D
Kurzerhand:
Delphi-Quellcode:
//DB_Main.ConnectParams.CharSet := 'UTF8';
DB_Main.ConnectParams.CharSet := 'ISO8859_1';
Wie ich vorgegangen bin?

1. Google nach Firebird+utf8+Delphi+Dbgrid suchen lassen
2. Gleich der erste Eintrag brachte diesen Thread.
3. Umgestellt, gestartet und funktioniert.

Perlsau 20. Jun 2012 10:47

AW: Umlaute in UTF8: Äthiopien statt Äthiopien
 
Zitat:

Zitat von Perlsau (Beitrag 1171719)
HEUREKA!Problem gelöst!!! :-D:-D:-D

Nein, doch nicht gelöst: eine Abfrage, nachdem die Verbindung zur DB hergestellt ist, ergibt: keine Unicode-Verbindung
Delphi-Quellcode:
IF DB_Main.IsUnicodeConnect THEN ShowMessage('Unicode-Verbindung');
War also doch nur eine Scheinlösung ... :oops:

Perlsau 20. Jun 2012 13:45

AW: Umlaute in UTF8: Äthiopien statt Äthiopien
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich tippe nun ganz entschlossen auf einen Bug in meiner alten FibPlus-Version. Bei Devrace steht nämlich zu lesen:
"By default in Delphi 2009-2010 unicode fields are mapped to TFIBWideStringField objects. This improvement was made because TStringField cannot be processed correctly in MIDAS applications."

Aber so richtig verstehe ich das nicht, das gebe ich ganz offen zu. Immerhin hab ich aber jetzt herausgefunden, daß meine Datenbank, wenn man sie mit DbExpress (geht leider nicht mit meiner Delphi-Version) anspricht, diesen Fehler nicht zeigt. Das linke Bild hat mir ein freundlicher XE2-Besitzer "geschossen", nachhdem er mit meiner DB kurz nachgebaut hatte, was bei mir Probleme macht. Das Feld Währung in der linken Tabelle (LAND) ist ein Look-Up-Feld, definiert im ClientDataset. Bei mir sieht das dagegen noch immer so aus wie im Bild rechts.

tsteinmaurer 20. Jun 2012 14:36

AW: Umlaute in UTF8: Äthiopien statt Äthiopien
 
Hallo Frank,

ich glaube du verweist auf den 6.9.9 ChangeLog? Darin sind noch ein paar weitere Bugs als gefixt gekennzeichnet, die mit Unicode zu tun haben. Sofern du Zugriff auf eine neuere FIBPlus Version hast, würde ich mal ein Upgrade versuchen, bevor du in eine andere Richtung siehst. Ich verwende selbst FIBPlus nicht, aber hatte immer wieder mal über Probleme mit Unicode gelesen und es wurden in diesem Bereich mit jedem Release Stabilisierungen vorgenommen.

lg,
Thomas

Perlsau 20. Jun 2012 14:49

AW: Umlaute in UTF8: Äthiopien statt Äthiopien
 
Zitat:

Zitat von tsteinmaurer (Beitrag 1171788)
Hallo Frank, ich glaube du verweist auf den 6.9.9 ChangeLog? Darin sind noch ein paar weitere Bugs als gefixt gekennzeichnet, die mit Unicode zu tun haben.

Ja, z.B.:
"The error in DataSet.FieldValues when working with unicode databases in RAD Studio 2009."
und
"An error in Unicode lookup-fields has been fixed."

Da ham die wohl nicht richtig gefixt ...

Zitat:

Zitat von tsteinmaurer (Beitrag 1171788)
Sofern du Zugriff auf eine neuere FIBPlus Version hast, würde ich mal ein Upgrade versuchen, bevor du in eine andere Richtung siehst.

Nein, leider nicht.

Zitat:

Zitat von tsteinmaurer (Beitrag 1171788)
Ich verwende selbst FIBPlus nicht, aber hatte immer wieder mal über Probleme mit Unicode gelesen und es wurden in diesem Bereich mit jedem Release Stabilisierungen vorgenommen.

Tja, jetzt wollt ich mal was richtig machen und auf Unicode umsatteln – endlich! – und dann sowas ...:cry:

Ich schau mal, ob ich das mit anderen DB-Komponenten hinkriege. FibPlus ist mir zu teuer, um neuere Versionen zu erwerben. Mit UIB hatte ich ebenfalls bereits schlechte Erfahrungen gemacht. Außerdem hab ich im Moment sowieso kein Geld übrig für irgendwelche Anschaffungen ... Also verzichte ich erstmal auf Unicode und mache weiter mit meinem gewohnten ISO8859_1, da weiß ich, was ich habe ...

blackfin 20. Jun 2012 15:46

AW: Umlaute in UTF8: Äthiopien statt Äthiopien
 
Evtl könntest du es mal zeitweise mit den ZEOS Komponenten versuchen, die sind ja (AFAIK immer noch) kostenlos.
Später, wenn du dann mal Geld für Komponenten übrig hast, kannst du dann evtl. auf UNIDAC umstellen, meines Erachtens die besten Datenbank-Komponenten, zumindest hatte ich noch nie Probleme mit denen und finde das Handling sehr elegant.
Ich hatte damals von ZEOS 7 auf UniDAC umgestellt, die Umstellung war sehr einfach und in kurzer Zeit erledigt.

P.S.
Kann aber sein, dass mein Tipp Mist ist und du dir mit den Zeos-Komponenten noch mehr Ärger einhandelst...habe mit Ihnen schon lange nicht mehr gearbeitet.

Perlsau 20. Jun 2012 16:25

AW: Umlaute in UTF8: Äthiopien statt Äthiopien
 
Zitat:

Zitat von blackfin (Beitrag 1171801)
Evtl könntest du es mal zeitweise mit den ZEOS Komponenten versuchen, die sind ja (AFAIK immer noch) kostenlos.
Später, wenn du dann mal Geld für Komponenten übrig hast, kannst du dann evtl. auf UNIDAC umstellen, meines Erachtens die besten Datenbank-Komponenten, zumindest hatte ich noch nie Probleme mit denen und finde das Handling sehr elegant.
Ich hatte damals von ZEOS 7 auf UniDAC umgestellt, die Umstellung war sehr einfach und in kurzer Zeit erledigt.

P.S.
Kann aber sein, dass mein Tipp Mist ist und du dir mit den Zeos-Komponenten noch mehr Ärger einhandelst...habe mit Ihnen schon lange nicht mehr gearbeitet.

Zeos hab ich in meinem Radstudio ebenfalls installiert, ist aber wesentlich langsamer als FibPlus und viel umständlicher zu handhaben von wegen Provider und ClientDataset usw.

Was mir noch auffällt: Wenn ich auf ISO8859_1 umstelle, kann ich in den Tabellen-Lookup-Feldern locker nach dem richtigen Eintrag suchen mit Eingabe der ersten paar Buchstaben, wie man das eben so von einer Lookup-Komponente kennt. Habe ich dagegen auf UTF8 gestellt, geht das nicht mehr ... die Lookup-Komponente in der Tabelle reagiert nicht auf meine Eingaben, nur auf Cursertasten und Enter ...

Perlsau 20. Jun 2012 20:56

AW: Umlaute in UTF8: Äthiopien statt Äthiopien
 
So, jetzt hab ich eine Lösung entwickelt, ohne vorerst auf meine Zugriffskomponenten verzichten zu müssen:

In der DB hab ich ein View erstellt, das ich in Delphi mit einem Dataset verbinde. Daneben läuft natürlich noch ein Dataset mit der "echten" Tabelle. Beide Tabellen zeigen stets denselben Datensatz. Will ich die Währungs-Spalte des angezeigten Landes ändern, verwende ich dazu eine TDBLookupComboBox, die bei Enter die "echte" Tabelle Währung in den Editmodus versetzt und bei Exit postet und mit demselben Atemzug das View-Dataset refresht bzw. schließt und wieder öffnet. Die Darstellung in im DB-Grid ist jetzt korrekt.

Perlsau 23. Jun 2012 06:29

Nachtrag
 
Zitat:

Zitat von Perlsau (Beitrag 1171839)
Will ich die Währungs-Spalte des angezeigten Landes ändern, verwende ich dazu eine TDBLookupComboBox, die bei Enter die "echte" Tabelle Währung in den Editmodus versetzt und bei Exit postet und mit demselben Atemzug das View-Dataset refresht bzw. schließt und wieder öffnet. Die Darstellung in im DB-Grid ist jetzt korrekt.

Nachtrag

Die Darstellung im DB-Grid ist zwar korrekt, jedoch warten meine alten FibPlus-Kompos mit einem weiteren Fehler auf: Die Einträge in der TDBLookupComboBox lassen sich nicht via Anfangsbuchstaben auswählen, wenn die Tabellen in der DB mit UTF8 kodiert sind.

Workaround: Beim Programmstart werden die Felder der benötigten Tabellen in normale Commboboxen eingelesen. Beim der Anwendung dieser Comboboxen ist aber auf einiges zu achten:

1. Ist die Indexierung (PK = PrimaryKey) der entsprechenden Tabelle durchgehend fortlaufend und gleichzeitig sichergestellt, daß keine Einträge gelöscht werden und somit später Index-Nummern fehlen, kann der ItemIndex der Combobox als Referenz auf den Index der Tabelle verwendet werden. Dabei ist aber zu beachten, daß eine Tabellen-Indexierung nicht immmer mit 0 beginnt wie der ItemIndex einer TStringList.

2. Trifft obige Voraussetzung nicht zu, muß der mit dem gewählten Combobox-Eintrag assoziierte Tabelleneintrag mittels Locate gesucht werden.

Immerhin, so funktioniert es erstmal.

Fazit: Man muß nicht immer Geld für Komponenten ausgeben, wenn man sich auch anders zu helfen weiß ... :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz