Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi unicode_fss-konvertierung (https://www.delphipraxis.net/71705-unicode_fss-konvertierung.html)

sancho1980 19. Jun 2006 19:38

Datenbank: firebird 1.5 • Zugriff über: ibx, ibexpert

unicode_fss-konvertierung
 
hallo,

ich habe folgendes problem:

ich lese daten mit tstringfield - komponenten aus einer paradox-tabelle und will diese in einer firebird-datenbank speichern.

die char-felder in der paradox-tabelle sind 1-byte-chars, die in der firebird-tabelle sind in unicode_fss.

habe zuerst probiert, für die firebird-tabelle twidestringfield - komponenten zu nehmen.
das geht aber nicht, da firebird scheinbar die felder selbst als 1-byte-chars versendet (scheinbar spaltet der die 2-byte-zeichen auf)..jedenfalls bekomm ich immer eine exception, schon wenn ich nur die firebird-datenbank öffne, dass das feld vom typ string ist, aber widestring erwartet wird.

wenn ich stattdessen tibstringfield - komponenten verwende, klappt zwar das übertragen der daten von der einen tabelle in die andere, aber umlaute und sonderzeichen werden falsch 'konvertiert'

zumindest bei einem bloßen:

Delphi-Quellcode:
var
  ibsf: TIBStringField;
  sf: TStringField;
 
  ibsf.AsString := sf.AsString;
Wie bekomme ich es hin, dass der in ibsf das widestring-äquivalent von sf speichert?
wenn firebird diesen unicode_fss - zeichensatz hat, muss es doch auch möglich sein, da widestrings zu speichern, oder?

danke,

martin

mkinzler 19. Jun 2006 20:02

Re: unicode_fss-konvertierung
 
IBX ist nicht wirklich unicode-fähig.
Aber versuch mal
Delphi-Quellcode:
Table.FieldByName(<filedname>).AsWideString
Aber wahrscheinlich mußt du wohl auf andere Komponenten umsteigen.

sancho1980 19. Jun 2006 20:12

Re: unicode_fss-konvertierung
 
Zitat:

Zitat von mkinzler
IBX ist nicht wirklich unicode-fähig.
Aber versuch mal
Delphi-Quellcode:
Table.FieldByName(<filedname>).AsWideString
Aber wahrscheinlich mußt du wohl auf andere Komponenten umsteigen.


ja die eigenschaft gibt es leider nicht :-(

weißt du von irgendwelchen komponenten, mit denen ich das 100% gebacken krieg?

danke,

martin

mkinzler 19. Jun 2006 20:15

Re: unicode_fss-konvertierung
 
Also bei Zeos gibte es diese Eigenchaft. Wenn du mir ne datenbank mit daten schickst kann ich es Testen.

Funktionieren müßte es auch mit IBObjects, fibplus, IBDac.

sancho1980 19. Jun 2006 20:26

Re: unicode_fss-konvertierung
 
Liste der Anhänge anzeigen (Anzahl: 1)
klar

hier ist so ne datenbank

bei den feldern kannst du dir ja unter vielen paar aussuchen, asterm, zster, etc...alles strings

danke,

martin

ps: fib-plus hab ich auch installiert, aber davon versteh ich nix

und zeos hatte ich bei mir nie installiert bekommen; hatte es irgendwann aufgegeben...

..wenns klappt sag mir bitte auch wie du's anstellst!

mkinzler 19. Jun 2006 20:38

Re: unicode_fss-konvertierung
 
Hallo Martin, könntest du mir die weiteren Teile der Paradox-tabelle noch nachliefern?

sancho1980 20. Jun 2006 02:32

Re: unicode_fss-konvertierung
 
Liste der Anhänge anzeigen (Anzahl: 1)
oh ja, sorry, da gehört ja noch mehr dazu...
danke,
martin

mkinzler 20. Jun 2006 06:24

Re: unicode_fss-konvertierung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Mit Zeos gehts

mikhal 20. Jun 2006 07:29

Re: unicode_fss-konvertierung
 
Die Zugriffskomponenten IBDAC von CoreLabs unterstützen Unicode.

Grüße
Mikhal

sancho1980 21. Jun 2006 16:16

Re: unicode_fss-konvertierung
 
hey,
ihr kennt euch doch bestimmt mit sowas aus:
habe rausgefunden, dass ich die umwandlung auch mit den ibx-komponenten hinbekomme, vorausgesetzt ich wandle die strings vor speicherung in widestrings um; eine passende funktion dafür hab ich schon gefunden:

Delphi-Quellcode:
{:Converts Ansi string to Unicode string using specified code page.
  @param  s       Ansi string.
  @param  codePage Code page to be used in conversion.
  @returns Converted wide string.
}
function StringToWideString(const s: AnsiString; codePage: Word): WideString;
var
  l: integer;
begin
  if s = '' then
    Result := ''
  else
  begin
    l := MultiByteToWideChar(codePage, MB_PRECOMPOSED, PChar(@s[1]), - 1, nil, 0);
    SetLength(Result, l - 1);
    if l > 1 then
      MultiByteToWideChar(CodePage, MB_PRECOMPOSED, PChar(@s[1]),
        - 1, PWideChar(@Result[1]), l - 1);
  end;
end; { StringToWideString }
Mein Problem ist folgendes: ich muss der funktion ja eine codepage in form eines numerischne werts übergeben und ich find leider nicht wo steht, welcher wert welcher codepage entspricht...hab durch ausprobieren schon mal rausgefunden, dass der wert für win1252 = 1 ist aber wie ist er bei anderen codepages...irgendwo muss das doch dokumentiert sein...
danke,

martin

himitsu 21. Jun 2006 17:49

Re: unicode_fss-konvertierung
 
Du kannst ja als CodePage auch die 0 übergeben, dann würd die aktuell verwendete CodePage (des Systems) für die umwandlung verwendet.

sancho1980 21. Jun 2006 17:59

Re: unicode_fss-konvertierung
 
Zitat:

Zitat von himitsu
Du kannst ja als CodePage auch die 0 übergeben, dann würd die aktuell verwendete CodePage (des Systems) für die umwandlung verwendet.

aber das kann nicht hinhauen:

was ich mache ist folgendes: ich wandle eine paradox-datenbank in eine firebird-datenbank um
wenn ich die paradox-tabelle öffne (nicht unicode-enabled) werden sämtliche sonderzeichen korrekt dargestellt...also geh ich mal davon aus, dass bei mir die richtige codepage für die datenbank eingestellt ist
wenn ich das ganze jetzt aber umwandle in eine (unicode)-datenbank, dann müsste bei verwendung von cp_acp (= 0) ja alles so umgewandelt werden, wie es vorher (ohne unicode) zu sehen war, schließlich verwendet er ja die selbe codepage als referenz für die umwandlung
trotzdem wird das ergebnis falsch
wenn ich aber statt cp_acp, den wert 1 übergebe wird es richtig umgewandelt...
verstehst du was ich meine?

himitsu 21. Jun 2006 18:39

Re: unicode_fss-konvertierung
 
Ich weiß jetzt nicht welche Konstante welchen Wert hat ... vielleicht sind sie ja auch schon irgendwo in Delphi implementiert ... schau einfach mal im MSDN nach was bei dir verwendet/nötig ist.

http://msdn.microsoft.com/library/en...icode_17si.asp

Wenn du keine Delphi-Pro+-Version hast (also keine Delphi-QuellCodes), dann einfach mal die Konstanden CP_xxx aus'm MSDN in ein Programm kopieren und schauen welchen Wert diese haben.

sancho1980 21. Jun 2006 18:46

Re: unicode_fss-konvertierung
 
hab ich schon geprüft
cp_acp = 0 und eben das funzt net :-(

sancho1980 21. Jun 2006 18:56

Re: unicode_fss-konvertierung
 
mal ne ganz blöde frage, nur um sicher zu gehen, dass ich alles richtig verstehe..
wo müsst ich denn deiner auffassung nach die codepage in windows einsehen/ändern können?

himitsu 21. Jun 2006 18:56

Re: unicode_fss-konvertierung
 
und was ist die 1?

sancho1980 21. Jun 2006 19:06

Re: unicode_fss-konvertierung
 
Zitat:

Zitat von himitsu
und was ist die 1?

genau das weiß ich ja eben nicht
eigentlich müsst ich bei 0 ja automatisch die richtige codepage kriegen...

himitsu 22. Jun 2006 10:52

Re: unicode_fss-konvertierung
 
Hast du mal nachgesehn, was die anderen Konstanten (aus'm MSDN) haben?


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