![]() |
Datenbank: Postgres • Version: 9.3 (x86) • Zugriff über: FireDAC
utf8 Encoding RichEdit --> Postgres.Text
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:
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.
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; Dann habe ich das Ganze als Parameter in eine Update-Query übergeben.
Delphi-Quellcode:
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:
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;
Code:
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.
[FireDAC][Phys][PG][libpq] FEHLER: ungültige Byte-Sequenz für Kodierung „UTF8“: 0x00
Hat jemand einen Anregung für mich? |
AW: utf8 Encoding RichEdit --> Postgres.Text
Standardmäßig besteht RTF (RichText) aus 7 Bit (ASCII) Zeichen. UTF-8 ist im ASCII Bereich eins zu eins (ohne Umkodierung) kompatibel. Also sollte es eigentlich möglich sein, RTF in eine Datenbank hinein- und unverändert wieder heraus zu bekommen.
Was ich versuchen würde: * kontrollieren ob nicht-ASCII Zeichen enthalten sind * alle Bytes des Inputs und des Outputs vergleichen und Unterschiede hier posten, eventuell kann man daran eteas erkennen * das konkrete Datenbanktabellenfeld auf ASCII oder 'ohne Encoding' einstellen |
AW: utf8 Encoding RichEdit --> Postgres.Text
Postgres hab ich hier zwar installiert, aber derzeit kein aktuelles Projekt damit am Laufen, weshalb ich das Folgende jetzt nur für Firebird darstellen kann (bzw. keine Lust habe, jetzt extra ein Testprojekt und eine Test-DB zu erstellen):
Wenn ich in ![]() ![]() |
AW: utf8 Encoding RichEdit --> Postgres.Text
Danke, bytea passt.
|
AW: utf8 Encoding RichEdit --> Postgres.Text
Gerne :thumb: Freut mich, wenn's paßt. Heißt ja nicht umsonst: Ruhig bleiben und Tee trinken :lol:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:16 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