Textkonvertierung ANSI zu UTF8

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 331
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Textkonvertierung ANSI zu UTF8

Beitrag von Niesi »

Hallo,

weiß irgendwer, wo ich Dokumentation, Beispiele oder ähnliches zu "ConvertEncodingToUtf8" finden kann?

Weder hier im Lazarusforum noch mit der Suchmaschine meiner Wahl kann ich da etwas ausführliches entdecken.

Im Moment bekomme ich die auszuwertenden Textdateien sauber in UTF8 konvertiert, aber es können in Zukunft auch andere Textformen dazu kommen - und ganz und gar verstanden habe ich "ConvertEncodingToUtf8" auch noch nicht, was mich ein wenig unsicher macht ...

Vielen Dank und beste Grüße
Niesi
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...


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

Re: Textkonvertierung ANSI zu UTF8

Beitrag von theo »

Niesi hat geschrieben:aber es können in Zukunft auch andere Textformen dazu kommen

Was heißt "Textformen"? Entscheidend ist lediglich die Kodierung. Wenn du nur "ISO 8859-1" verwendest, wird sich nichts ändern.
Wenn du z.B. auch kyrillische Daten hast, musst du anders umwandeln etc.. Z.B. https://de.wikipedia.org/wiki/ISO_8859-5
Und nein, eine "ANSI" Datei (schwieriger Begriff) identifiziert sich nicht als eine bestimmte Kodierung.
Es ist nur mit heuristischen Verfahren softwaremäßig festzustellen, was die ursprüngliche Kodierung sein könnte.

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 331
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: Textkonvertierung ANSI zu UTF8

Beitrag von Niesi »

Danke an wp_xyz, den Artikel kannte ich gar nicht.

Eine direkte Doku zu "ConvertEncodingToUtf8" habe ich unter den Links leider auch nicht gefunden.

Aber gut, es funktioniert, ich werde weiter versuchen, die Quelltexte zu verstehen.

Noch mal: Danke.
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 331
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: Textkonvertierung ANSI zu UTF8

Beitrag von Niesi »

theo hat geschrieben:
Niesi hat geschrieben:aber es können in Zukunft auch andere Textformen dazu kommen

Was heißt "Textformen"? Entscheidend ist lediglich die Kodierung. Wenn du nur "ISO 8859-1" verwendest, wird sich nichts ändern.
Wenn du z.B. auch kyrillische Daten hast, musst du anders umwandeln etc.. Z.B. https://de.wikipedia.org/wiki/ISO_8859-5
Und nein, eine "ANSI" Datei (schwieriger Begriff) identifiziert sich nicht als eine bestimmte Kodierung.
Es ist nur mit heuristischen Verfahren softwaremäßig festzustellen, was die ursprüngliche Kodierung sein könnte.



Naja, Notepad++ zeigt mir eine ANSI-Kodierung an. Leider weiß ich nicht, wie die Textausgaben kodiert sind und auch nicht, ob noch andere dazu kommen. Es handelt sich um die Ergebnisausgaben von Berechnungsprogrammen, die ich auswerten muss.

Das Problem ist, dass in den Texten auch Umlaute sind, die ohne "ConvertEncodingToUtf8" eben "irgendwie" (meißt als Fragezeichen) dargestellt werden. Damit lässt sich dann nicht so toll in den Dateien "navigieren", also suchen oder herauskopieren.

Und auch Dir Danke für die Antwort.
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

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

Re: Textkonvertierung ANSI zu UTF8

Beitrag von wp_xyz »

Niesi hat geschrieben:Eine direkte Doku zu "ConvertEncodingToUtf8" habe ich unter den Links leider auch nicht gefunden.

Also im Ernst: was brauchst du dafür eine Dokumentation? Die Funktion macht genau das, wie sie heißt: sie konvertiert einen String von einem als Parameter angegebenen Encoding nach UTF8 um. Was diese Begriffe bedeuten? Dazu verweise ich auf den Artikel im vorigen Post. Wenn du mit ANSI-Strings zu tun hast, die mit deutschen (mitteleuropäischem) Windows geschrieben worden sind, haben diese in der Regel die Code-Seite CP1252, der Aufruf wäre dann ConvertEncodingToUTF8(str, 'cp1252'); die erlaubten Encodingnamen stehen am Anfang der Unit lconvencoding.

Niesi hat geschrieben:Naja, Notepad++ zeigt mir eine ANSI-Kodierung an. Leider weiß ich nicht, wie die Textausgaben kodiert sind und auch nicht, ob noch andere dazu kommen. Es handelt sich um die Ergebnisausgaben von Berechnungsprogrammen, die ich auswerten muss.

Ich weiß nicht, wie Notepad++ das macht, aber ohne Analyse des Textes kommt man da nicht ran. Denn einem Zeichen, das für unsere CP1252 codiert ist, sieht man das genausowenig an, wie einer 1-Byte-Zahl, ob sie mit oder ohne Vorzeichen zu lesen ist. Im englischen Forum wurde vor einiger Zeit diskutiert, dass man eine bestimmte externe DLL einsetzen kann (ich weiß den Namen nicht mehr), um eine solche Analyse durchzuführen und das Encoding zu ermitteln.

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 331
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: Textkonvertierung ANSI zu UTF8

Beitrag von Niesi »

wp_xyz hat geschrieben:... Wenn du mit ANSI-Strings zu tun hast, die mit deutschen (mitteleuropäischem) Windows geschrieben worden sind, haben diese in der Regel die Code-Seite CP1252, der Aufruf wäre dann ConvertEncodingToUTF8(str, 'cp1252'); die erlaubten Encodingnamen stehen am Anfang der Unit lconvencoding.




Sorry, aber das ist nicht richtig. Bei mir funktioniert die Funktion mit dem Aufruf

MyMemo.Text := ConvertEncodingToUtf8(DerText.Text, GuessEncoding(DerText.Text), yesno);

Mit dem Text in einem tStringList als DerText.Text und einer boolean als yesno.
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

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

Re: Textkonvertierung ANSI zu UTF8

Beitrag von wp_xyz »

Richtig, den letzten Parameter hatte ich übersehen, er gibt an, ob der String durch die Routine verändert worden ist:

Code: Alles auswählen

function ConvertEncodingToUTF8(const s, FromEncoding: string; out Encoded: boolean): string

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 331
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon (Windows wenn notwendig), Lazarus 3.0 FPC 3.3.1

Re: Textkonvertierung ANSI zu UTF8

Beitrag von Niesi »

Für alle, die da auch mal Texte mit Umlauten und/oder "ß" in einem tMemo verarbeiten wollen oder müssen, führe ich hier mal die Funktion auf, die ich heute entdeckte und die mir auch am besten gefällt - vielleicht spart das einmal Suchzeit:

MyMemo.Text := ConvertEncoding(DerText.Text, 'cp1252', 'utf8');

Sie konvertiert den Text sauber zu UTF8, der Aufruf ist einfach und verständlich.

Sie stammt aus der Unit "LConvEncoding".
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Antworten