Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Unterschied UTF8 / Unicode (https://www.delphipraxis.net/161701-unterschied-utf8-unicode.html)

TheMiller 16. Jul 2011 14:10

Unterschied UTF8 / Unicode
 
Hallo,

ich bin auf Delphi 2009 umgestiegen und passe nun meine Projekte an. Dabei verstehe ich den Unterschied zwischen UTF-8 und Unicode nicht, was mich zu einem Problem führt. Also:

Das eine Projekt hat im Hintergrund eine Firebird-Datenbank. Mittels einer Boolean-Variable kann ich beim Connecten mit der DB-Klasse entscheiden, ob die Verbindung und Strings UTF-8 sein sollen. Meine gesamte Datenbank hat als Charset und Collate UTF8 eingestellt.

Verwende ich nun den Datentyp "String" im Projekt (was ja Unicode-String ist, oder?), bekomme ich die Meldung "Malformed String" von Firebird.

Dann habe ich mal testweise die Charset und Collate auf Unicode_CI gestellt, UTF8-Boolean-Schalter auf true gesetzt und nun kann ich Strings mit Umlauten eintragen.

Ich dachte aber bisher immer, dass UTF8 Unicode ist. War meine Vorgehensweise hier überhaupt richtig - oder nur Zufall?

Bitte um Hilfe und/oder Aufklärung ;)

Danke!

mkinzler 16. Jul 2011 14:15

AW: Unterschied UTF8 / Unicode
 
Unicode ist ein Überbegriff, UTF-8 eien konkrete Unicode-Implementierung/Codierung.
Delphi verwendet wie Windows aber UTF-16

TheMiller 16. Jul 2011 14:39

AW: Unterschied UTF8 / Unicode
 
Ok. Das heißt, ich muss die Datenbank komplett auf "Unicode" umstellen und nicht auf UTF-8 stehen lassen. Alternative wäre, beim lesen/schreiben ein "utf8decode"/"utf8encode" zu verwenden, oder?
Hab ich das richtig verstanden?

mkinzler 16. Jul 2011 14:43

AW: Unterschied UTF8 / Unicode
 
Die Konvertierung sollte deine Zugriffsbibliothek erledigen. UTF-16 ist eine realtiv einfache Implemnetierung, hierbei werden anstatt der 8 Bit bei ASCII/Ansi 16Bit pro Zeichen verwendet. Bei UTF-8 ist die Anzahl variabel ( wichtige Zeichen 8, weniger wichtige 16 oder mehr Bit)

TheMiller 16. Jul 2011 14:50

AW: Unterschied UTF8 / Unicode
 
Zitat:

Zitat von mkinzler (Beitrag 1112051)
Die Konvertierung sollte deine Zugriffsbibliothek erledigen.

Verstehe ich gerade nicht. Meine Zugriffsbibliothek ist meine Datenbankklasse mit den Methoden "Write","Read","Change","Delete" etc.

Nun habe ich in meinem Post vorgeschlagen, in diesen Methoden die Konvertierung mittels utf8encode einzubauen.

Was du mir geschrieben hast, bedeutet das ein "Ja, kannst du so machen", oder eher ein "Nein, das macht man ganz anders" ;) Falls letzteres, dann habe ich deine Antwort nicht verstanden :-D

Danke.

mkinzler 16. Jul 2011 14:55

AW: Unterschied UTF8 / Unicode
 
Du verwendest also direkz fbclient.dll-Funktionen?

TheMiller 16. Jul 2011 15:02

AW: Unterschied UTF8 / Unicode
 
Nein, ich benutze ZEOS zur Verbindung mit der Datenbank (Firebird Embedded).

Zur einfachen Steuerung habe ich mir eine Klasse geschrieben, die unter anderem die DB liest/schreibt. Diese Methoden sind so aufgebaut:

Delphi-Quellcode:
procedure TDBBase.Read(Obj: TObject);
var
  Test: TTest;
begin
  if (Obj is TTest) then
  begin
    Obj.Property1:=getString('[SPALTEN_NAME]');
  end;
end;

//ReadString:
function TDBBase.getString(Field: string): String;
begin
  if (fdbUTF8) then
  begin
    result:=utf8decode(ZQuery.FieldByName(Field).AsString);
  end else
  begin
    result:=ZQuery.FieldByName(Field).AsString;
  end;
end;
Ein aufruf erfolgt dann so:

Delphi-Quellcode:
var
  Test: TTest;
begin
  Test.ID:=20;
  Read(Test);
  ShowMessage(Test.Property1);
  Test.Free;
end;
So habe ich das bisher immer gemacht. Wenn UTF8 auf True steht, wird Zeos als Verbindungsparameter "codepage=utf8" übergeben. Das hat bis Delphi 2009 super funktioniert.

mkinzler 16. Jul 2011 15:09

AW: Unterschied UTF8 / Unicode
 
Delphi-Quellcode:
ZQuery.FieldByName(Field).AsString
liefert dir aber einen UnicodeString (UTF-16) und keinen UTF8 codierten RawByteString.

TheMiller 16. Jul 2011 15:15

AW: Unterschied UTF8 / Unicode
 
Also liegt das Problem darin, dass in der Datenbank utf8 verwendet wird und Zeos (Version 7) einen "vollen" Unicode-String zurückgibt. Deswegen hat es auch funktioniert, als ich die Spalten auf "Unicode" gestellt habe. Habe ich das richtig verstanden?

Was würdest du mir jetzt raten? Das Programm ist schon länger im praktischen Einsatz und die Benutzer haben logischerweise auch viele Daten eingetragen. Soll ich nun meine Klasse abändern, oder soll ich versuchen, die Daten/Felder ins Unicode-Format zu bekommen?

Wie konvertiere ich denn zwischen utf8 und Unicode?

mkinzler 16. Jul 2011 15:21

AW: Unterschied UTF8 / Unicode
 
Zeos scheint den Umschwung nach Unicode (UTF-16) noch nicht ganz geschafft zu haben.
http://zeosbugs.firmos.at/view.php?id=214
Wurde aber in Zeos7 Alpha gefixt

TheMiller 16. Jul 2011 15:22

AW: Unterschied UTF8 / Unicode
 
Hm.. ich habe aber Zeos 7 alpha.

mkinzler 16. Jul 2011 15:25

AW: Unterschied UTF8 / Unicode
 
Dann sollte das Decode eigentlich nicht notwendig sein

blackfin 16. Jul 2011 15:34

AW: Unterschied UTF8 / Unicode
 
Ich würde für D2009 + Firebird eher zu IBDAC / UniDAC greifen, falls du ein paar Euronen übrig hast.
Da funktioniert eine UTF8-Datenbank mit D2009 "out-of-the-box", ohne dass man sich groß um die Konvertierungen Gedanken machen muss.

Zeos hat jeder Ecke irgendwelche Umständlichkeiten oder Mini-Bugs...ich habe Zeos auch ewig lang verwendet, seit dem Umstieg auf UniDAC möchte ich Zeos aber nicht mal mehr mit der Zange anfassen :-D

Das ist meine persönliche Meinung, aber die Erfahrung hat mir gezeigt, dass es sich gerade bei DB-Zugriffsbibliotheken lohnt, mal ein paar Euros auszugeben, da eine saubere und intelligent gestrickte Implementierung einem viel Zeit erspart und Nerven schont.

TheMiller 16. Jul 2011 15:36

AW: Unterschied UTF8 / Unicode
 
Hallo,

hab leider kein Geld für dieses Projekt zur Verfügung. Dann muss ich erstmal schauen, wo und wie ich codieren mussen.

Danke soweit.

mkinzler 16. Jul 2011 15:37

AW: Unterschied UTF8 / Unicode
 
Sehe ich genauso

http://www.delphipraxis.net/144005-s...-new-post.html

TheMiller 16. Jul 2011 18:10

AW: Unterschied UTF8 / Unicode
 
Hallo!

Habe eine Lösung gefunden. Und zwar musste ich die Versionen aus dem SVN nehmen. Nun kann ich Unicode schreiben. Lesen klappt ohne Probleme, jedoch zeigt die TreeView wieder encoding-Probleme. Brauche ich eine spezielle TreeView-Komponente, die unicode-fähig ist?

Sorry, aber ich kenne mich mit D2009 noch nicht so dolle aus ;)

Danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:53 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