AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi utf8 Encoding RichEdit --> Postgres.Text
Thema durchsuchen
Ansicht
Themen-Optionen

utf8 Encoding RichEdit --> Postgres.Text

Ein Thema von nakaramia · begonnen am 14. Jan 2015 · letzter Beitrag vom 14. Jan 2015
Antwort Antwort
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
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#2

AW: utf8 Encoding RichEdit --> Postgres.Text

  Alt 14. Jan 2015, 11:49
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
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#3

AW: utf8 Encoding RichEdit --> Postgres.Text

  Alt 14. Jan 2015, 11:57
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 Firebird ein Blob-Feld ausschließlich für die Aufnahme eines RichEdit-Textes erstelle, nehme ich die Binär- und nicht die Text-Variante, weil ansonsten ähnliche unerwünschte Phänomene auftreten, wie du sie beschrieben hast. Bei Wahl der Binär-Variante des Blobfeldes findet keine Überprüfung des Zeichensatzes statt, der Stream wird genau so ins Blobfeld eingelesen, wie er vom RichEdit "abgesondert" wird. Damit gibt es keinerlei Verfälschungen oder verzerrte Darstellungen.
  Mit Zitat antworten Zitat
nakaramia

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

AW: utf8 Encoding RichEdit --> Postgres.Text

  Alt 14. Jan 2015, 13:59
Danke, bytea passt.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#5

AW: utf8 Encoding RichEdit --> Postgres.Text

  Alt 14. Jan 2015, 14:50
Gerne Freut mich, wenn's paßt. Heißt ja nicht umsonst: Ruhig bleiben und Tee trinken
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz