Autor Beitrag
bl3nder
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 58



BeitragVerfasst: Do 14.09.06 15:12 
Hallo
In meinem MySQL Query Browser werden die Daten nicht richtig angezeigt.
Die Buchstaben Ä,Ö,Ü,ß werden durch andere Sonderzeichen ersetzt.
Nun uebernimmt auch meine Stringgridanzeige diese Eigenschaft.
Wie schaffe ich es, dass die Daten da ordentlich angezeigt werden ?

Gruß
bl3nder Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 58



BeitragVerfasst: Mo 18.09.06 07:13 
da weiß wohl niemand bescheid ;)

nagut
cu
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Mo 18.09.06 15:35 
user profile iconbl3nder hat folgendes geschrieben:
da weiß wohl niemand bescheid ;)

nagut
cu


Doch. Ist normal. Alte DBase-Dateien speichern Umlaute wie auf DOS-PC, nicht nach Windows-ANSI. D.h. bei jedem Lesen oder Schreiben eines Records muss eine Umwandlung von der Iso-Codepage nach ANSI und zurück erfolgen.

Oft wird das in der Datenbank-Software zentral eingestellt, wenn nicht, gibt es Windowsroutinen dafür wie OemToAnsi usw.

Gruss Reinhard
bl3nder Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 58



BeitragVerfasst: Di 19.09.06 11:07 
In der Datenbanksoftware ist es bereits auf utf8 umgestellt. Wieso er es im qry browser trotzdem falsch anzeigt ist mir ein Raetsel.

Wie genau benutze ich oemtoansi oder oemtochar ?

Sowas bspw funktioniert nicht, weil ich von einem String lese, er aber ein pansichar will:

Grid.Cells[2,Grid.RowCount-2] := oemtoansi(SQLQuery.FieldByName('Benutzer').AsString);

oder gibts es sowas wie stringtoansi ?
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Di 19.09.06 14:29 
user profile iconbl3nder hat folgendes geschrieben:
In der Datenbanksoftware ist es bereits auf utf8 umgestellt. Wieso er es im qry browser trotzdem falsch anzeigt ist mir ein Raetsel.

Wie genau benutze ich oemtoansi oder oemtochar ?

Sowas bspw funktioniert nicht, weil ich von einem String lese, er aber ein pansichar will:

Grid.Cells[2,Grid.RowCount-2] := oemtoansi(SQLQuery.FieldByName('Benutzer').AsString);

oder gibts es sowas wie stringtoansi ?


Hallo,

stringtoansi wäre kein Problem zu schreiben, aber wenn die Datenbank utf8 hat, ziehe ich meinen Vorschlag zurück: die ganze OemAnsi-Mimik ist veraltet, sie diente zur Umsetzung verschiedener 256-Byte-Zeichensätze wie ISO8859 und eben Windows (Latin1). UTF8 ist dagegen eine verkürzte Darstellung von Unicode. Generell ist OEM die Vergangenheit, Unicode ist die Zukunft (in der Gegenwart funktioniert beides nicht so einfach).

Für die Umsetzung gibt es in Win32 die Funktion MultiByteToWideChar. Es gibt zwar in Delphi den Stringtyp WideChar, aber VCL usw. sind keineswegs Unicodefähig. Du müsstest also nochmal WideChar to AnsiString konvertieren (und ev. Fehler berücksichtigen). Umgekehrt dann alles rückwärts.

Es ist natürlich zweckmässig, so etwas zentral einzubauen. Für Oem ist z.B. bei ODBC-Treibern für DBase ein Häkchen zu setzen, dann braucht man sich darum nicht mehr kümmern, ähnlich hat TCustomEdit in Delphi eine Eigenschaft OEMConvert und wandelt dann alles selbst um. Das wird aber meiner Meinung nach für UTF8 nichts nützen.

Win32 kennt keine Strings, man muss daher immer zwischen array of char/PChar und Strings hin- und her kopieren oder wandeln, aber das wird zur Routine. Man sollte immer die Windows-Umwandlungen benutzen, weil diese sich automatisch nach den lokalen Einstellungen richten.

Gruss Reinhard

Nachtrag: das alles funktioniert sowieso nur, wenn Unicode-Fähige Schriften installiert sind - vielleicht hilft ja das schon weiter, insbesondere bei Fremdsoftware wie einem Dateibrowser.
bl3nder Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 58



BeitragVerfasst: Di 19.09.06 14:55 
also wenn ich dich richtig verstanden habe muss ich dafuer sorgen, dass aus den String ein WideChar wird, den ich wiederrum in AnsiString konvertieren muss (wozu es keine Routine gibt).
Ich habe gemerkt, dass ich aber auch direkt
ausblenden Delphi-Quelltext
1:
Grid.Cells[5,Grid.RowCount-2] := SQLQuery.FieldByName('Bemerkungen').AsWideString;					

schreiben kann. Allerdings loest das das Problem nicht.
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Di 19.09.06 15:55 
user profile iconbl3nder hat folgendes geschrieben:
also wenn ich dich richtig verstanden habe muss ich dafuer sorgen, dass aus den String ein WideChar wird, den ich wiederrum in AnsiString konvertieren muss (wozu es keine Routine gibt).
Ich habe gemerkt, dass ich aber auch direkt
ausblenden Delphi-Quelltext
1:
Grid.Cells[5,Grid.RowCount-2] := SQLQuery.FieldByName('Bemerkungen').AsWideString;					

schreiben kann. Allerdings loest das das Problem nicht.


Hallo,

laut MSDN-Doku: WideCharToMultiByte aufrufen mit CP_ACP als Codepage liefert einen ANSI-String in Latin1. Siehe Win SDK-Hilfe.

Die Funktion AsWideString sollte dem Namen nach den nötigen WideString liefern (Aber der ist eben immer noch Unicode, das ist ja der Sinn).

Herumgoogeln bringt jedenfalls die Information, dass viele damit Probleme haben.

Gruss Reinhard
Ydobon
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 42



BeitragVerfasst: Di 19.09.06 16:49 
Wenn die Datenbank UTF-8 liefert, genügt UTF8Decode (oder WideCharToMultiByte mit CP_UTF8). Die Umwandlung Widestring zu lokalen AnsiStrings geschieht bei Zuweisung automatisch.