Codepage bei TDBf und dbase

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Dunkelbunt
Beiträge: 2
Registriert: Fr 5. Mär 2010, 16:37

Codepage bei TDBf und dbase

Beitrag von Dunkelbunt »

Hallo,
ich verwende Lazarus in der neuesten Version, WindowsXP und bin relativ neu in FPC und Lazarus.
Um mich einzuarbeiten versuche ich mich an einer - vermeintlich - leichten Aufgabe.
Ich habe von einem älteren Programm eine dbase IV Tabelle, deren Inhalt ich darstellen, verändern und wieder darin speichern möchte.
Das geht auch.
Allerdings werden in den TDBEdit und TDBGrid die Umlaute nur durch ? dargestellt. Wenn ich schreibe sehe ich die Umlaute richtig, diese werden dann aber im anderen Programm, welches ich auf demselben Rechner gestartet habe, falsch dargestellt.
Hat jemand eine Idee und/oder Lösungsvorschlag, wie ich dieses Anzeigeproblem lösen kann?

Vielen Dank schon mal.
Fred

shokwave
Beiträge: 471
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Codepage bei TDBf und dbase

Beitrag von shokwave »

Hallo und Herzlich Willkommen hier im Forum.

Das hatten wir doch schon mal. Schau mal hier http://www.lazarusforum.de/viewtopic.php?f=17&t=3006&p=32668&hilit=tdbf#p32668

[Edit]

Hatte mir auch mal die Mühe gemacht und 'ne OemToAnsi-Funktion (ab)geschrieben, da das von Lazarus implementierte nur unter Windows läuft. Die originale war glaube ich aus 'nem russischen Forum und für die russische Codepage.

Code: Alles auswählen

procedure OEMtoANSI(var Src,Dest:String);
const
  //OEM 850 (DOS - Latin1)
  OEM  = #$80#$81#$82#$83#$84#$85#$86#$87#$88#$89#$8A#$8B#$8C#$8D#$8E#$8F+
         #$90#$91#$92#$93#$94#$95#$96#$97#$98#$99#$9A#$9B#$9C#$9D#$9E#$9F+
         #$A0#$A1#$A2#$A3#$A4#$A5#$A6#$A7#$A8#$A9#$AA#$AB#$AC#$AD#$AE#$AF+
         #$B0#$B1#$B2#$B3#$B4#$B5#$B6#$B7#$B8#$B9#$BB#$BB#$BC#$BD#$BE#$BF+
         #$C0#$C1#$C2#$C3#$C4#$C5#$C6#$C7#$C8#$C9#$CC#$CC#$CC#$CD#$CE#$CF+
         #$D0#$D1#$D2#$D3#$D4#$D5#$D6#$D7#$D8#$D9#$DD#$DB#$DC#$DD#$DE#$DF+
         #$E0#$E1#$E2#$E3#$E4#$E5#$E6#$E7#$E8#$E9#$EA#$EB#$EC#$ED#$EE#$EF+
         #$F0#$F1#$F2#$F2#$F4#$F5#$F6#$F7#$F8#$F9#$FA#$FB#$FC#$FD#$FE#$FF;
 
  //ANSI (Windows 1252 - Latin1)
  ANSI = #$C7#$FC#$E9#$E2#$E4#$E0#$E5#$E7#$EA#$EB#$E8#$EF#$EE#$EC#$C4#$C5+
         #$C9#$E6#$C6#$F4#$F6#$F2#$FB#$F9#$FF#$D6#$DC#$F8#$A3#$D8#$D7#$83+
         #$E1#$ED#$F3#$FA#$F1#$D1#$AA#$BA#$BF#$AE#$AC#$BD#$BC#$A1#$AB#$BB+
         #$00#$00#$00#$00#$00#$C1#$C2#$C0#$A9#$00#$00#$00#$00#$A2#$A5#$00+
         #$00#$00#$00#$00#$00#$00#$E3#$C3#$00#$00#$00#$00#$00#$00#$00#$A4+
         #$F0#$D0#$CA#$CB#$C8#$00#$CD#$CE#$CF#$00#$00#$00#$00#$A6#$CC#$00+
         #$D3#$DF#$D4#$D2#$F5#$D5#$B5#$FE#$DE#$DA#$DB#$D9#$FD#$DD#$AF#$B4+
         #$AD#$B1#$00#$BE#$B6#$A7#$F7#$B8#$B0#$A8#$B7#$B9#$B3#$B2#$00#$0A;
var
  i,j: integer;
  SR: string;
begin
  SR := '';
  for i := 1 to Length(Src) do
  begin
    j := Pos(Src[i], Oem);
    if j > 0 then SR := SR + ANSI[j] else SR := SR + Src[i];
  end;
  Dest := SR;
end;
mfg Ingo

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Codepage bei TDBf und dbase

Beitrag von Socke »

Vielleicht solltest du noch beachten, dass evtl. dein Quelltext in UTF-8 gespeichert wird und deshalb alle Strings in deinem Programm auch UTF-8 codiert sind (nicht die, die du von außerhalb lädst, ausgenommen LCL).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Codepage bei TDBf und dbase

Beitrag von marcov »

Siehe auch die "Charset" Unit (rtl/inc/charset.pp), das dazu gehörige program "creumap" (utils/creumap.pp) und die dazu Tabellen (rtl/ucmaps)

Charset ist ein Unit das mit solche encoding->unicode Mappings (wie in rtl/ucmaps), beliebige Konversionen machen kann. (intern setzt es nach Unicode um, und dann wieder zurück nach die Target encoding)

Die Mappings können von Disk nachgeladen werden, oder mit "creumap" können damit Units generiert werden (wie zb compiler/cp*), um ans "ein Binärdatei Prinzip" fest zu halten.

Die Mapping Dateien kommen direkt von Unicode.org, also wenn eine nicht dabei ist, kann man sie dort einfach finden.

Dunkelbunt
Beiträge: 2
Registriert: Fr 5. Mär 2010, 16:37

Re: Codepage bei TDBf und dbase

Beitrag von Dunkelbunt »

Hallo Leute,
vielen Dank für die Hilfe. Ich werde die Tips mal durchprobieren.

Danke Fred

Antworten