SynEdit und Code-Umwandlung

Rund um die LCL und andere Komponenten
Antworten
lzuser
Beiträge: 97
Registriert: Sa 20. Jun 2009, 16:00
OS, Lazarus, FPC: Win10 20H2, Laz 2.0.8 auch Linux Mint Mate 20, Laz 2.0.6
CPU-Target: 64Bit

SynEdit und Code-Umwandlung

Beitrag von lzuser »

Lazarus 1.8.4 auf Win10

Wenn ich das richtig verstanden haben, kodiert ein SynEdit per Voreinstellung in UTF8?
Ich habe einige Texte codiert in ISO 8859-1 (lt. Notepad++)
Wenn ich einen solchen Text in ein SynEdit lade, werden die deutschen Umlaute und einige Sonderzeichen wegen UTF8 falsch angezeigt.

Vermutlich wegen Verständnislücken bleiben trotz Doc-Studien die Fragen:
Wie kann man SynEdit so umschalten, dass ISO 8859-1 richtig angezeigt wird? Gibt es da eine Eigenschaft?
Durch welchen Aufruf kann ich den in SynEdit.Text geladenen Text in UTF8 umcodieren?
Meine "müden" Versuche mit
uses LConvEncoding;
Merke:=SE.Text; ConvertEncodingToUTF8(Merke,'cp1252',Encoded); SE.Text:=Merke;

sind gescheitert.
Danke für eine "Nachhilfeeinheit".

wp_xyz
Beiträge: 3447
Registriert: Fr 8. Apr 2011, 09:01

Re: SynEdit und Code-Umwandlung

Beitrag von wp_xyz »

ConvertEncoding ist eine Funktion, der konvertierte String steht im Result, und das wirfst du weg...

Code: Alles auswählen

Merke:=SE.Text;
SE.Text := ConvertEncodingToUTF8(Merke,'cp1252',Encoded);

Ganz optimal ist das aber auch nicht, denn die Erzeugung von SE.Text kostet einen Haufen Zeit, und das Schreiben ins SynEdit hat wahrscheinlich auch eine Menge Zusatzoperationen. Ich würde eher die ISO 8859-1 Datei in einen Hilfs-String einlesen und diesen in the ConvertEncoding-Routine stecken, deren Ergebnis ins SynEdit übergeben wird. Außerdem sehe ich noch, dass CP1252 nicht dasselbe ist wie ISO 8859-1:

Code: Alles auswählen

var
  s: String;
begin
  ...  // Datei in s einlesen...
  SE.Text := ISO_8859_1ToUTF8(s)
  // dasselbe wie ConvertEncoding, nur muss man nicht nachsehen, wie genau die Eingangs- und Ausgangsencodings geschrieben werden

pluto
Lazarusforum e. V.
Beiträge: 7097
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: SynEdit und Code-Umwandlung

Beitrag von pluto »

Ich gehe davon aus, dass man in SynEdit einfach die Codierung einstellen kann. Es gibt extrem viele Optionen....
Mich würde es wundern, wenn das nicht gehen würde....
MFG
Michael Springwald

lzuser
Beiträge: 97
Registriert: Sa 20. Jun 2009, 16:00
OS, Lazarus, FPC: Win10 20H2, Laz 2.0.8 auch Linux Mint Mate 20, Laz 2.0.6
CPU-Target: 64Bit

Re: SynEdit und Code-Umwandlung

Beitrag von lzuser »

wp_xyz hat geschrieben:SE.Text := ISO_8859_1ToUTF8(s);

Was es doch alles für schöne Prozeduren gibt...
Welche Unit muss ich dafür unter uses einbinden?
Und gibt es dafür eine kurze Übersicht/Erläuterung?

pluto hat geschrieben: in SynEdit einfach die Codierung einstellen kann. Es gibt extrem viele Optionen....

Ja... z.B. danach hatte ich schon mehrfach gesucht und nichts gefunden.

Vielen Dank erstmal.

Ally
Beiträge: 164
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: SynEdit und Code-Umwandlung

Beitrag von Ally »

Folgendes funktioniert ganz gut.
GuessEncoding ist zwar nicht ganz perfekt, rät in den meisten Fällen aber richtig.

Gruß Roland

Code: Alles auswählen

 
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, SynEdit, SynEditTypes, SynEditMouseCmds, SynEditKeyCmds, LConvEncoding;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog: TOpenDialog;
    SynEdit1: TSynEdit;
    procedure Button1Click(Sender: TObject);
  private
 
  public
 
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var
  SL: TStringList;
begin
  OpenDialog.Filter := 'Alle Dateien|*.*|Textdateien (*.txt)|*.txt';
 
  if OpenDialog.Execute then
  begin
    if FileExists(OpenDialog.FileName) then
    begin
      SL := TStringList.Create;
      try
        SL.LoadFromFile(OpenDialog.FileName);
        SL.Text := ConvertEncoding(SL.Text, GuessEncoding(SL.Text), EncodingUTF8);
        SynEdit1.Lines.Text := Sl.Text;
      finally
        SL.Free;
      end;
    end;
  end;
end;
 
end.

wp_xyz
Beiträge: 3447
Registriert: Fr 8. Apr 2011, 09:01

Re: SynEdit und Code-Umwandlung

Beitrag von wp_xyz »

lzuser hat geschrieben:
wp_xyz hat geschrieben:SE.Text := ISO_8859_1ToUTF8(s);

Was es doch alles für schöne Prozeduren gibt...
Welche Unit muss ich dafür unter uses einbinden?
Und gibt es dafür eine kurze Übersicht/Erläuterung?

Mit gedrückter CTRL-Taste auf dem Wort IS_8859_1ToUtf8 im Quelltext-Editor klicken, dann öffnet sich die Unit, in der das deklariert ist: lconvencoding. Und wenn du durch den Quelltext im Interface-Teil scrollst siehst du auch, was es sonst noch gibt.

pluto hat geschrieben: in SynEdit einfach die Codierung einstellen kann. Es gibt extrem viele Optionen....

Es gibt zwar ein "UseUTF8" (public, also nicht im Object-Inspector), aber da ich die Gegenvariable über die Ausgangscodierung nicht finde, nehme ich an, das ist für etwas anderes als die Umcodierung des Texts. Und Martin hat in viewtopic.php?f=18&t=8728 auch geschrieben: "SynEdit erwartet utf8, also muss die Umwandlung vorher erfolgen".

pluto
Lazarusforum e. V.
Beiträge: 7097
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: SynEdit und Code-Umwandlung

Beitrag von pluto »

Es gibt zwar ein "UseUTF8" (public, also nicht im Object-Inspector),

Außerdem ist es nur ReadOnly...
Stimmt... ich hatte ein anders Projekt im "Kopf"... ich glaube das war noch die Delphi Version(Die ich 2006 zu letzt gesehen hatte)
MFG
Michael Springwald

martin_frb
Beiträge: 499
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: SynEdit und Code-Umwandlung

Beitrag von martin_frb »

SynEdit unterztuetzt nur Utf8. Keine Optionen.

Die original Version (und ggf Delphi) sind afaik Utf16.

Antworten