Umlaute in memo anzeigen.

Antworten
kirchfritz
Beiträge: 172
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Umlaute in memo anzeigen.

Beitrag von kirchfritz »

Hi,
ich möchte mit folgendem einfachen Programm den Inhalt einer Textdatei in ein TMemo einlesen:
Leider werden die Umlaute im Memo nur als "?" dargestellt.

Code: Alles auswählen

 
unit Testunit;
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, StdCtrls;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
  public
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Lines.LoadFromFile('C:\TXT.TXT');
end;
 
end.
 
TXT.TXT
Das ist die Textdatei
(94 Bytes) 94-mal heruntergeladen
Das ist der ScreenShot
Das ist der ScreenShot
ScreenShot.png (26.51 KiB) 2172 mal betrachtet


Wer kann helfen?

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Umlaute in memo anzeigen.

Beitrag von m.fuchs »

Binde mal die Unit LConvEncoding ein und mach nach dem LoadFromFile folgendes:

Code: Alles auswählen

Memo1.Lines.Text := ConvertEncoding(Memo1.Lines.Text, GuessEncoding(Memo1.Lines.Text), EncodingUTF8);
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

kirchfritz
Beiträge: 172
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: Umlaute in memo anzeigen.

Beitrag von kirchfritz »

Habe ich gemacht, Ergebnis immer noch "übel"
Zweiter Versuch
Zweiter Versuch

kirchfritz
Beiträge: 172
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: Umlaute in memo anzeigen.

Beitrag von kirchfritz »

Die Umlaute in der Textdatei haben die Byte-Werte
129 = "ü" und
132 = "ä"

das habe ich mittels einer ASCII-Tabelle herausgefunden.
Wieso ist es so kompliziert diese ASCII-Zeichen im Memo darzustellen?
Schließlich sind das für mich ganz "normale" Umlaute.
Wo liegt den hier das Problem?

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

Re: Umlaute in memo anzeigen.

Beitrag von theo »

Das geht nicht über Memo, da werden die Nicht-UTF-8 Zeichen schon verschluckt.

Zuerst in eine TStringList laden, dann konvertieren und dem Memo zuweisen.

Das sind übrigens keine ASCII Zeichen, das sind ANSI Zeichen. Lazarus arbeitet mit Unicode UTF-8.

Alternativ auch http://wiki.freepascal.org/Theodp TCharEncStream.

kirchfritz
Beiträge: 172
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: Umlaute in memo anzeigen.

Beitrag von kirchfritz »

Ich habe jetzt dies hier eingefügt:

Code: Alles auswählen

 
Memo1.Lines.Text := ConvertEncoding(Memo1.Lines.Text, GetConsoleTextEncoding, EncodingUTF8);
 


Damit klappt es mit den Umlauten

Hurra, es klappt!
Hurra, es klappt!

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

Re: Umlaute in memo anzeigen.

Beitrag von theo »

Seltsam, aber ich wünsche viel Glück! :wink:

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Umlaute in memo anzeigen.

Beitrag von m.fuchs »

Das funktioniert aber nur, wenn die Datei zufälligerweise das Textencoding der Konsole nutzt.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Umlaute in memo anzeigen.

Beitrag von Michl »

m.fuchs hat geschrieben:Binde mal die Unit LConvEncoding ein und mach nach dem LoadFromFile folgendes:

Code: Alles auswählen

Memo1.Lines.Text := ConvertEncoding(Memo1.Lines.Text, GuessEncoding(Memo1.Lines.Text), EncodingUTF8);
Hey - vielen Dank, kannte ich bisher auch noch nicht, kommt mir bei einem Projekt gerade wie gerufen!

Code: Alles auswählen

  Str:=ConvertEncoding(Str, 'CP850', 'UTF8');
- schönes Tool!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten