Einzelnen Beitrag anzeigen

nakaramia

Registriert seit: 1. Mär 2013
25 Beiträge
 
Delphi 2007 Enterprise
 
#1

utf8 Encoding RichEdit --> Postgres.Text

  Alt 14. Jan 2015, 10:32
Datenbank: Postgres • Version: 9.3 (x86) • Zugriff über: FireDAC
Delphi XE5

Hallo,
mir stellt sich folgendes Problem:

Wenn ich aus einem RichEdit-Feld über einen Stream in die DB einlese, bekomme ich die falsche Zeichencodierung. Die Datenbank hat UTF8 und die FDConnection ist ebenfalls auf UTF8 eingestellt. Dennoch stehen in der DB dann chinesische Schriftzeichen statt der lateinischen Buchstaben. Also werden meine Daten als 16bit behandelt und in 32bit abgelegt. Zumindest ist das Ganze in sich konsistent, so dass die Texte in den RichEdit-Feldern korrekt angezeigt werden, was mir aber in der DB nichts nützt.
Für die TFDQuery nutze ich die default-Einstellungen.

in die Datenbank schreiben
Delphi-Quellcode:
procedure TForm1.WriteAsStream;
var
  ss: TMemoryStream;
begin
  FDQuery1.Open;
  FDQuery1.Append;
  ss := TMemoryStream.Create();
  try
    RichEdit1.Lines.SaveToStream(ss);
    TBlobField(FDQuery1.FieldByName('Stream')).LoadFromStream(ss);
    FDQuery1.Post;
  finally
    ss.Free;
  end;
  FDQuery1.Refresh;
end;
Sieht wunderbar aus in der Delphi-Anwendung, aber in der Datenbank wird deutlich, dass hier ein falsches Encoding übermittelt wird. Ich habe es auch bereits mit einem TStringStream versucht, ändert aber nichts am Problem.

Dann habe ich das Ganze als Parameter in eine Update-Query übergeben.
Delphi-Quellcode:
procedure TForm1.WriteAsParam;
var
  strS: TStringStream;
begin
  FDQuery1.Last;
  FDQuery3.Prepare;
  strS := TStringStream.Create;
  try
    RichEdit1.Lines.SaveToStream(strS);
    FDQuery3.ParamByName('memo').AsMemo := RichEdit1.Text;
    FDQuery3.ParamByName('text').Text := strS.DataString;
    FDQuery3.ParamByName('id').AsInteger := FDQuery1.FieldByName('id').AsInteger;
    FDQuery3.Execute;
    FDQuery3.Close;
  finally
    strS.Free;
  end;
  FDQuery1.Refresh;
  FDQuery1.Last;
end;
Bei AsMemo geht natürlich die Formatierung verloren, aber der Zeichensatz passt. Für die Übergabe des Strings aus dem Stream bekomme ich folgende Fehlermeldung:

Code:
      [FireDAC][Phys][PG][libpq] FEHLER: ungültige Byte-Sequenz für Kodierung „UTF8“: 0x00
Diese erscheint beim selben formatierten Text, der mit der ersten Funktion fehlerfrei aber im falschen Encoding in der Datenbank landet. Es wird deutlich, dass der Fehler über den Stream erzeugt wird, aber mir ist nicht klar, wie ich das behebe.

Hat jemand einen Anregung für mich?
  Mit Zitat antworten Zitat