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?