Lazarus charset - Umlaute

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
PMPaco
Beiträge: 7
Registriert: Sa 1. Mär 2008, 10:35

Lazarus charset - Umlaute

Beitrag von PMPaco »

Hallo,
mein Problem ist, das Anzeigen von Umlauten eines Textes in einem SynMemo. Umlaute werden aus irgendeinem Grund als Fragezeichen angezeigt. Die Daten kommen definitiv korrekt beim SynMemo an.

Ich nutze Lazarus 0.9.24 Beta auf Ubuntu Linux.

Danke schon mal im Voraus.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Du versuchst ANSI in einem Unicode Control darzustellen.
Du musst den text vorher in UTF-8 umwandeln. (UTF8Encode)
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

PMPaco
Beiträge: 7
Registriert: Sa 1. Mär 2008, 10:35

Beitrag von PMPaco »

Danke erstmal. Das hatte ich leider schon erfolglos probiert. Die Funktion UTF8Encode hat keine Wirkung. Umlaute werden noch immer nicht dargestellt.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Das GTK1 Interface unterstützt Unicode auch nicht vollständig es kommt möglicherweise auch aufs Control an. Du kannst auch den Systemzeichensatz auf einen nicht Unicode Zeichensatz setzen dann sollte es mit ANSI klappen. Das wirde hier schon 2-3 mal diskutiert ich hab den verlauf aber nicht mehr vollends im Kopf musst mal suchen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

PMPaco
Beiträge: 7
Registriert: Sa 1. Mär 2008, 10:35

Beitrag von PMPaco »

Okay. Hab zwar GTK2 beim Compiler verwendet, trotzdem noch das Problem. Ich such mal. Dankeschön...

PMPaco
Beiträge: 7
Registriert: Sa 1. Mär 2008, 10:35

Beitrag von PMPaco »

Ok. Ich bitte abermals um Hilfe. Leider ist das Problem nach wie vor nicht in den Griff zu bekommen. Alles durchgegoogled und bei Wiki belesen. Hilft nichts. Was benötige ich, um in TMemo Umlaute zu laden? Reinschreiben kann man sie ja. Auch wenn ich die Var mit dem Content speichere: alles da. Nur das übertragen des Variableninhaltes in das Memo bringt weiterhin Fragezeichen vor.

PMPaco
Beiträge: 7
Registriert: Sa 1. Mär 2008, 10:35

Beitrag von PMPaco »

*push*

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Klappt bei mir Problemlos.

Wie lädst du das genau rein? Läuft deine IDE unter GTK1 oder GTK2?
Wie sieht deine $LANG aus?

PMPaco
Beiträge: 7
Registriert: Sa 1. Mär 2008, 10:35

Beitrag von PMPaco »

Ich entnehme die Daten einer MySQL Datenbank. Diese wiederum ist "latin1_german1_ci" codiert. Meine IDE läuft unter GTK2, genau wie der Compiler. Meine $LANG ist komplett "de_DE.UTF-8". Tja, ich sitz jetzt schon den ganzen Tag. Keine Ahnung, was da los ist. Danke auch an dich.
Grüße

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Ach so. Dann kannst du entweder die DB-Tabelle auf Unicode umstellen, oder das hier Probieren (Beispiel Anhand einer Latin1 Datei):

Code: Alles auswählen

procedure LongToWide(const Buf: Pointer; const BufSize: Integer;
    const DestBuf: Pointer);
var I : Integer;
    P : Pointer;
    Q : Pointer;
    V : LongWord;
begin
  if BufSize <= 0 then
    exit;
  P := Buf;
  Q := DestBuf;
  For I := 1 to BufSize div 4 do
    begin
      V := PLongWord(P)^;
      Inc(PLongWord(P));
      PLongWord(Q)^ := (V and $FF) or ((V and $FF00) shl 8);
      Inc(PLongWord(Q));
      V := V shr 16;
      PLongWord(Q)^ := (V and $FF) or ((V and $FF00) shl 8);
      Inc(PLongWord(Q));
    end;
  For I := 1 to BufSize mod 4 do
    begin
      PWord(Q)^ := PByte(P)^;
      Inc(PByte(P));
      Inc(PWord(Q));
    end;
end;
 
 
function LongStringToWideString(const S: AnsiString): WideString;
var L : Integer;
begin
  L := Length(S);
  SetLength(Result, L);
  if L = 0 then
    exit;
  LongToWide(Pointer(S), L, Pointer(Result));
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var Sli:TStringList;
begin
 if OpenDialog1.Execute Then
 begin
  Sli:=TStringList.create;
  Sli.LoadFromFile(OpenDialog1.FileName);
  Memo1.text:=UTF8Encode(LongStringToWideString(Sli.text));
  Sli.free;
 end;
end;


Vielleicht gibt's für diese Umwandlung auch eine eingebaute Funktion, kenn ich aber nicht.

PMPaco
Beiträge: 7
Registriert: Sa 1. Mär 2008, 10:35

Beitrag von PMPaco »

Ich werds gleich mal probieren. Vielen Dank. Klasse Forum hier.
GreEtz

KOBOLD Messring GmbH
Beiträge: 155
Registriert: Mi 22. Aug 2007, 14:52
OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 65719 Hofheim am Taunus
Kontaktdaten:

Beitrag von KOBOLD Messring GmbH »

Ähnliches Problem hatte ich auch bei folgender Konstellation:

Lazarus und Widget-Set: gtk2
MySQL-Datenbank Kodierung: UTF8_general_ci
Memo und ListBox.Font.CharSet = DEFAULT_CHARSET

diese Kombination ist die EINZIGE, wo überhaupt "lesbare" Buchstaben aus den Datensätzen angezeigt werden, AUSSER NATÜRLICH Umlaute werden als Fragezeichen dargestellt
Bei anderen Font.CharSet settings (z.B. UNICODE oder ANSI-CHARSET)
werden nur Kästchen statt Buchstaben dargestellt, sehr unschön...

¡¡ Die LongStringToWideString Routine von theo wirkt Wunder !!
Damit funktioniert's, endlich erscheint "Köln" als "Köln" und nicht mehr als "K?ln"

gtmind.de
Beiträge: 9
Registriert: So 27. Feb 2011, 16:23
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.4.z)
CPU-Target: AMD 32/64 bit
Wohnort: Dessau-Roßlau
Kontaktdaten:

Re: Lazarus charset - Umlaute

Beitrag von gtmind.de »

Danke an theo :D :)
Firebird Datenbank, Alte Daten welche mit Delphiprogramm eingegeben wurden (ne ganze menge) keine Umlaute.
Mit LongstringToWidestring gehts :twisted:
Auch aus Steinen, die einem in den Weg gelegt werden, kann man etwas schönes bauen.

Antworten