SynEdit und Code-Umwandlung

Rund um die LCL und andere Komponenten

SynEdit und Code-Umwandlung

Beitragvon lzuser » 23. Feb 2019, 13:23 SynEdit und Code-Umwandlung

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".
lzuser
 
Beiträge: 81
Registriert: 20. Jun 2009, 16:00

Beitragvon wp_xyz » 23. Feb 2019, 14:10 Re: SynEdit und Code-Umwandlung

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
wp_xyz
 
Beiträge: 2945
Registriert: 8. Apr 2011, 09:01

Beitragvon pluto » 23. Feb 2019, 14:32 Re: SynEdit und Code-Umwandlung

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
Aktuelles Projekt: ContentManager2(Ehmals NoteManager2).
pluto
Lazarusforum e. V.
 
Beiträge: 6998
Registriert: 19. Nov 2006, 13:06
Wohnort: Oldenburg(Oldenburg)
OS, Lazarus, FPC: Linux Mint 19.2 | 
CPU-Target: AMD
Nach oben

Beitragvon lzuser » 23. Feb 2019, 17:32 Re: SynEdit und Code-Umwandlung

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.
lzuser
 
Beiträge: 81
Registriert: 20. Jun 2009, 16:00

Beitragvon Ally » 23. Feb 2019, 17:45 Re: SynEdit und Code-Umwandlung

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.
Ally
 
Beiträge: 127
Registriert: 11. Jun 2009, 09:25

Beitragvon wp_xyz » 23. Feb 2019, 18:37 Re: SynEdit und Code-Umwandlung

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".
wp_xyz
 
Beiträge: 2945
Registriert: 8. Apr 2011, 09:01

Beitragvon pluto » 23. Feb 2019, 18:41 Re: SynEdit und Code-Umwandlung

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
Aktuelles Projekt: ContentManager2(Ehmals NoteManager2).
pluto
Lazarusforum e. V.
 
Beiträge: 6998
Registriert: 19. Nov 2006, 13:06
Wohnort: Oldenburg(Oldenburg)
OS, Lazarus, FPC: Linux Mint 19.2 | 
CPU-Target: AMD
Nach oben

Beitragvon martin_frb » 23. Feb 2019, 23:37 Re: SynEdit und Code-Umwandlung

SynEdit unterztuetzt nur Utf8. Keine Optionen.

Die original Version (und ggf Delphi) sind afaik Utf16.
martin_frb
 
Beiträge: 442
Registriert: 25. Mär 2009, 22:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other | 
CPU-Target: mostly 32 bit
Nach oben

• Themenende •

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried