Fragezeichen statt Umlaute

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
laines
Beiträge: 45
Registriert: Mo 18. Apr 2011, 08:30

Fragezeichen statt Umlaute

Beitrag von laines »

Soooo !!! Nach ca. 4 Std. sinnlosem Googlen Frage ich jetzt einfach mal nach.

Ich habe:
  • MSSQL 2008 Datenbank DEFAULT_CHARSET
und greife darauf fleißig zu.

Mein DBGrid zeigt mir für die Umlaute nur leider ? (Fragezeichen) an und manchmal lässt er auch alle nachfolgenden Buchstaben weg.

Beispiel:
Rügen = R?gen
Köpf = K
...


Irgendwie muss ich doch GLOBAL das Problem lösen können oder ??
Schlauch lässt Grüßen

Gruß
Laines

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Fragezeichen statt Umlaute

Beitrag von Scotty »

Das ist eine FAQ. Such mal hier im Forum nach UTF8.

laines
Beiträge: 45
Registriert: Mo 18. Apr 2011, 08:30

Re: Fragezeichen statt Umlaute

Beitrag von laines »

Und da haben wir das nächste Problem !!

Bei jeder such anfrage nach Umlaute oder UTF8 ... bekomme ich folgende Antwort

Code: Alles auswählen

Die folgenden Wörter deiner Suchanfrage wurden ignoriert, da sie zu häufig vorkommen: utf8. ...
Du musst mindestens ein Wort angeben, nach dem gesucht werden soll. Jedes Wort muss aus mindestens 3 Buchstaben bestehen und darf ohne Platzhalter nicht mehr als 20 Buchstaben haben.

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Fragezeichen statt Umlaute

Beitrag von DiBo33 »

http://www.google.de/search?sclient=psy ... btnG=Suche" onclick="window.open(this.href);return false;

laines
Beiträge: 45
Registriert: Mo 18. Apr 2011, 08:30

Re: Fragezeichen statt Umlaute

Beitrag von laines »

Hallo DiBo33

Kann das Problem schon mit der IDE zusammen hängen ?
In meinem Hinweisfenster werden die Umlaute auch mit einem "?" angezeigt.

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Fragezeichen statt Umlaute

Beitrag von DiBo33 »

Was hast du denn für ein System?

laines
Beiträge: 45
Registriert: Mo 18. Apr 2011, 08:30

Re: Fragezeichen statt Umlaute

Beitrag von laines »

Sorry !!

Windows 7 64bit

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Fragezeichen statt Umlaute

Beitrag von DiBo33 »

FPC?
Lazarus?

Bei 64bit Win7 muß ich passen (sollte aber m.W. UTF-8 tauglich sein).

laines
Beiträge: 45
Registriert: Mo 18. Apr 2011, 08:30

Re: Fragezeichen statt Umlaute

Beitrag von laines »

FPC = 2.4.2
Lazarus IDE = 0.9.30.1

Socke
Lazarusforum e. V.
Beiträge: 3177
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: Fragezeichen statt Umlaute

Beitrag von Socke »

DiBo33 hat geschrieben:Bei 64bit Win7 muß ich passen (sollte aber m.W. UTF-8 tauglich sein).
Lazarus arbeitet auf allen Widgetsets (win32, GTK, QT, usw.) mit UTF-8. Das heißt: Die Zeichenketten, die angezeigt werden, werden als UTF-8 interpretiert. Wenn von der Datenbank eine andere Codierung geliefert wird (zum Beispiel, weil diese die Zeichenketten automatisch konvertiert oder diese dort so gespeichert sind), führt das zu Fehlern.

Die Codierung kann man zum Beispiel dadurch überprüfen, indem man die Zeichenkette in einer Variablen speichert und diese im Debugger betrachtet.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Fragezeichen statt Umlaute

Beitrag von Christian »

MSSQL interessiert es recht wenig in welchem Format die Daten in und aus der DB kommen.
Du scheinst mit einem anderen Programm die Daten in ANSI in die DB zu werfen, SQLdb (und auch Zeos) erwarten hier UTF-8.
Du müsstest in TFIeld.OnGetText und OnSetText die Konvertierung vornehmen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

laines
Beiträge: 45
Registriert: Mo 18. Apr 2011, 08:30

Re: Fragezeichen statt Umlaute

Beitrag von laines »

PUHHHH

Ihr verlangt ganz schön viel von einem Blutigen ANFÄNGER (ironisch gemeint).
o.K. Jetzt bin ich schon so weit und werde ich nicht aufgeben.
Mit etwas Unterstützung bekomme ich das hin.

Momentan sieht meine Abfrage so aus und ich habe keinen blassen Schimmer, wie ich hier weitermachen kann.

P.s.: Ich weiß sauber Programmieren sieht sicher anders aus, aber ich lerne ja noch und für das, dass ich mir das selber bei bringe bin ich STOLZ auf mich.

Code: Alles auswählen

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
    jahr:=Combobox1.Items[ComboBox1.ItemIndex];
    EditSuchen.Visible:=True;
    EditSuchen.Text:='';
    suchen:= '';
    ButtonSuchen.Visible:=True;
    //Erst mal Verbindungen schliessen
    SQLQuery1.Active:=False;
    // SQLQuery1 leeren
    SQLQuery1.SQL.Clear;
    strQuery := Format('SUM( CASE WHEN YEAR(tz.dDatum) = '+jahr+' THEN tz.fBetrag ELSE 0 END) ['+jahr+'] ', [jahr, jahr]);
    SQLQuery1.SQL.ADD(Format(sqlQuery, [strQuery, jahr]));
 
 //Hier wird der Combobox Eintrag der gewählt wurde eingetragen
    //Eintrag Betrag ändern Verbindungen wieder öffnen
    DBGrid1.COLUMNS.Items[8].Title.Caption := '*Umsatz bezahlt '+ jahr;
    DBGrid1.COLUMNS.Items[8].FieldName := jahr;
 
    IF (jahr = 'Gesamt') Then
    begin
        //Erst mal Verbindungen schliessen
        SQLQuery1.Active:=False;
        SQLQuery1.SQL.Clear;
      SQLQuery1.SQL.ADD(Format(sqlQuery, ['SUM(tz.fBetrag) AS [Gesamt]', 'Gesamt']));
      end;
    SQLQuery1.Active:= True;
 
     // Jahres Gesamtumsatz berechnen
  // Verhindern, dass die Anzeige ständig aktualisiert wird:
  SQLQuery1.DisableControls;
  SQLQuery1.first;
  summe:=0;
  while NOT SQLQuery1.eof do
  begin
      summe:=summe+SQLQuery1.FieldByName(jahr).AsFloat;
    SQLQuery1.next;
  end;
  begin
  SQLQuery1.EnableControls;
  SQLQuery1.first;
  Label3.Caption:= 'Umsatz für: ' +jahr;
  EditGesUmsatz.Text:=FloatToStrF(summe, ffCurrency, 8, 2);
  summeKunden:=0;
  summeKunden:=SQLQuery1.RecordCount;
  Label1.Caption:= 'Kunden Gesamt: '+IntToStr(summeKunden);
  end;
 
end;
Das einzige was ich annähernd gefunden habe ist das hier.
Aber wie ich es auch versuche ein zu bauen, ich komme einfach nicht zum Ziel.

Code: Alles auswählen

procedure Tmain_form.prTDBGridUTF8ToAnsi(DBGrid1: TDBGrid);
 
var
 i : Integer;
 
begin
 
   //Disable Screen UPDATE
   DBGrid1.DataSource.DataSet.DisableControls;
 
   DBGrid1.DataSource.DataSet.First;
 
   While NOT (DBGrid1.DataSource.DataSet.Eof) Do
   Begin
     FOR i := 0 TO DBGrid1.COLUMNS.Count -1 Do
     Begin
       DBGrid1.COLUMNS[i].FIELD.Value := UTF8ToAnsi(DBGrid1.COLUMNS[i].FIELD.AsString);
     End;
     DBGrid1.DataSource.DataSet.Next;
   End;
 
   DBGrid1.DataSource.DataSet.First;
 
   //Enable Screen UPDATE
   DBGrid1.DataSource.DataSet.EnableControls;
 
end;
Zuletzt geändert von Lori am Mi 21. Sep 2011, 19:27, insgesamt 1-mal geändert.
Grund: richtigen Highlighter

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Fragezeichen statt Umlaute

Beitrag von Christian »

Sry ich bin gerad zu faul um nachzuachen aber probier mal

DBGrid1.DataSource.DataSet.OnGetText := @ConvertText;

Srrg+Alt+C über Converttext

Und darin konvertierrst den Text dann.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Fragezeichen statt Umlaute

Beitrag von DiBo33 »

Code: Alles auswählen

strQuery := Format('SUM( CASE WHEN YEAR(tz.dDatum) = '+jahr+' THEN tz.fBetrag ELSE 0 END) ['+jahr+'] ', [jahr, jahr]);
Dann kannst du auf Format auch gleich verzichten, oder richtig machen

Code: Alles auswählen

strQuery := Format('SUM( CASE WHEN YEAR(tz.dDatum) = %s THEN tz.fBetrag ELSE 0 END) [%s] ', [jahr, jahr]);

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Fragezeichen statt Umlaute

Beitrag von hde »

Ich hab das ganze mal überflogen, hab aber nicht gefunden, ob du nun Zeos oder SQLdb benutzt. Oder hab ich's übersehen?

Wenn Zeos, dann mach in den Properties mal folgenden Eintrag: CodePage=utf8

Viel Spaß hde

Antworten