[gelöst] TMemo Ausgeben z.B. spanische Sonderzeichen

Rund um die LCL und andere Komponenten
Antworten
alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

[gelöst] TMemo Ausgeben z.B. spanische Sonderzeichen

Beitrag von alfware17 »

Hallo,

ich versuche, Textzeilen (Sprüche) über ein TMemo (hab auch schon Label und Messagebox probiert)
auszugeben. Datenbasis sind Dateien im älteren OEM (Ascii) Format, welches Pascal aber prima
versteht (ich habe ca.20Jahre Batchprogramme). Konvertierte Versionen der Dateien, die ich mal
für Java, Android und SQLite benutzt habe, verschlimmern das Problem eher noch, dann sind auch die
Umlaute kaputt.
Im Debugger kann ich noch sehen, daß in den Zeichenketten z.B. #164 oder #237 drin steht. Das TMemo
zeigt die aber nur noch als ? an.
Wenn jemand einen Tip hat, würde er mir sehr helfen. Eine lauffähige Version (naja enem außer den
spanischen Sprüchen) für Lazarus kann ich anfügen, aber vielleicht muß mir als Lazarus-Anfänger auch
nur jemand einen Tip geben und sorry wenn jeden Tag immer das gleich gefragt wird, aber ich habe
nichts gefunden. :roll:

Gruß Bernd
Zuletzt geändert von alfware17 am Do 30. Nov 2017, 17:43, insgesamt 1-mal geändert.

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TMemo Ausgeben z.B. spanische Sonderzeichen

Beitrag von Mathias »

Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

Re: TMemo Ausgeben z.B. spanische Sonderzeichen

Beitrag von alfware17 »

Mathias hat geschrieben:Vielleicht hilft dir dies weiter: https://mathiaspannier.wordpress.com/20 ... de-string/


Nein, leider nicht.

Ich habe hier im Form auch noch so einen Tip mit den SystoUtf8 gefunden
https://www.lazarusforum.de/viewtopic.p ... ute#p70303
Das Ergebnis ist dann leer :cry: wenn die spanischen Zeichen drin sind... (also GANZ leer, vorher waren
wenigstens die anderen Zeichen da außer den ? ...)

Hatte noch vergessen zu erwähnen, Umgebung ist Windows 7/64 - aber egal unter Linux gehts auch nicht
und auch nicht in einem XP, welches ich virtuell im Linux laufen hab. Also in keinem der 3 Systeme mag
TMemo den String übernehmen, den man ja kurz vorher im Debug noch sehen kann :shock:

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

Re: TMemo Ausgeben z.B. spanische Sonderzeichen

Beitrag von wp_xyz »

Das liegt daran, dass die Texte in diesen alten Dateien noch mit einer Ansi-Codeseite codiert sind, die nur 256 Zeichen darstellen kann; wenn du von OEM schreibst, ist wahrscheinlich die Codeseite 852 gemeint. In den 20 Jahren ist die Zeit weiter gegangen, und heute kann ein Dokument alle Zeichen enthalten. Lazarus verwendet die Variante UTF8. Hier sind die ersten 128 Zeichen mit den alten Zeichen identisch, alle anderen Zeichen bestehen aus zwei bis vier Bytes. Das "Ä", zum Beispiel, hat auf der OEM-Codepage 852 den Wert 142 ($8E), unter UTF8 dagegen die Bytefolge $C3 $84 (lt. Lazarus Zeichentabelle im Menü "Bearbeiten").

Du solltest gleich nach dem Einlesen eines Strings diesen mit Hilfe der Funktion CP852ToUTF8 nach UTF8 konvertieren. Wenn du in Lazarus mit diesem konvertierten String weiterarbeitest, wird er von allen Controls richtig angezeigt. Die Konvertierungsfunktion steht in der Unit LConvEncoding, in der du auch weitere Umwandlungen findest. Wenn du nicht weißt, welche Kodierung für deine Datei zutreffend ist, dann lade sie in Notepad++, dort wird die Codeseite rechts unten angezeigt.

Das beigefügte Beispiel lädt eine CP852-Datei einmal direkt in ein Memo (linker Button) und einmal erst nach Konvertierung (rechter Button).

Über UTF8 findest du im wiki u.a. folgende Artikel:
- http://wiki.freepascal.org/UTF8_strings_and_characters
- http://wiki.freepascal.org/Unicode_Support_in_Lazarus
Dateianhänge
ansi_datei.zip
(2.07 KiB) 69-mal heruntergeladen

alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

(gelöst) TMemo Ausgeben z.B. spanische Sonderzeichen

Beitrag von alfware17 »

wp_xyz hat geschrieben:Das liegt daran, dass die Texte in diesen alten Dateien noch mit einer Ansi-Codeseite codiert sind, die nur 256 Zeichen darstellen kann; wenn du von OEM schreibst, ist wahrscheinlich die Codeseite 852 gemeint. In den 20 Jahren ist die Zeit weiter gegangen, und heute kann ein Dokument alle Zeichen enthalten. Lazarus verwendet die Variante UTF8. Hier sind die ersten 128 Zeichen mit den alten Zeichen identisch, alle anderen Zeichen bestehen aus zwei bis vier Bytes. Das "Ä", zum Beispiel, hat auf der OEM-Codepage 852 den Wert 142 ($8E), unter UTF8 dagegen die Bytefolge $C3 $84 (lt. Lazarus Zeichentabelle im Menü "Bearbeiten").

Du solltest gleich nach dem Einlesen eines Strings diesen mit Hilfe der Funktion CP852ToUTF8 nach UTF8 konvertieren. Wenn du in Lazarus mit diesem konvertierten String weiterarbeitest, wird er von allen Controls richtig angezeigt. Die Konvertierungsfunktion steht in der Unit LConvEncoding, in der du auch weitere Umwandlungen findest. Wenn du nicht weißt, welche Kodierung für deine Datei zutreffend ist, dann lade sie in Notepad++, dort wird die Codeseite rechts unten angezeigt.

Das beigefügte Beispiel lädt eine CP852-Datei einmal direkt in ein Memo (linker Button) und einmal erst nach Konvertierung (rechter Button).

Über UTF8 findest du im wiki u.a. folgende Artikel:
- http://wiki.freepascal.org/UTF8_strings_and_characters
- http://wiki.freepascal.org/Unicode_Support_in_Lazarus


Oh :D :D :D Danke für die schnelle Hilfe, das hat gut geklappt, sowohl unter Linux als auch im Windoofs. 850 :mrgreen: hieß die Zauberzahl.
Ich habe meine Anwendung jetzt per Compilerschalter wahlweise zum Lesen der OEM-Dateien bzw meiner bereits konvertierten Ansi-Versionen
ausgelegt (CP850ToUTF8 bzw CP1252ToUTF8). Welches ich letztlich nehme, hängt leider von der Kompatibiltät zu weiteren ähnlichen Anwendungen
(Android, Java, Borland Pascal und Free-Pascal für verschiedene Plattformen ab 16bit) ab, muß ich sehen, ob sie das alle verstehen.

Wenn ich noch ein paar andere Problemchen gelöst habe, werde ich die Lösung auch hier rein hängen, derweil betrachte ich das Problem als gelöst
(weiß nicht, wie das zu kennzeichnen ist).

Aber: :roll: mein Notepad++ zeigt die genaue Codepage nicht an! Habe unten rechts nichts gefunden, und auch keine Einstellmöglichkeit. Aber ansonsten
genauso wie UE ein schönes Werkzeug.

alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

Re: TMemo Ausgeben z.B. spanische Sonderzeichen

Beitrag von alfware17 »

Hallo und hier wie versprochen mein Update :-)

Also die Cp850ToUtf8 für OEM war natürlich genau richtig.

Allerdings habe ich meine Daten jetzt alle auf Ansi konvertiert
und da braucht das Lazarus-Programm (siehe Anlage) eben eher
ein Cp1252ToUtf8 :-) damit das TMemo nicht mault...

Mein gesamtes Projekt beinhaltet aber noch Programmversionen für
- Android (die Ansi-Dateien werden erkannt)
- 16bit Borland-Pascal (ich habe meinen eigenen Filter entfernt, so wird Ansi akzeptiert)
- Linux (erstaunlicherweise keine Probleme mit dem Ansi)
- Java (kennt auch das Ansi)
- 16bit Turbo-Pascal (hier habe ich mir einen eigenen Ansi2OEM-Filter geschrieben,
da die als einzige auf dem OEM-Zeichensatz bestehen)
Nebenbei: obwohl es bestimmt 1 Million solcher Filter geben müßte, habe ich auf
Anhieb keinen gefunden und deshalb eben auf die Tippeltour analytisch mit 2 Ascii-Tabellen
meine Unit gebaut :-)))

Wer möchte, kann im Lazarus-Programm gerne in der INC Datei
1. - OEM/ANSI/EIGEN umstellen (aber nur einen davon)
- sollte aber beachten, daß nur die 043 und die 045 Datei OEM-Daten enthalten
(man kann die Sprüchedatei im Code und auch zur Laufzeit einstellen)
2. - TMemo / TLabel / Messagebox einschalten
- das spätere Release wird nur ANSI/TMemo enthalten

Das Ganze ist noch in der Entwicklung und ich habe leider mehr Ideen als Zeit und Knowhow,
obwohl jetzt sollten die wichtigsten Klippen umschifft sein.
Ziel ist es, auf SQlite also Datenbank umzustellen, für Java und Android habe ich das
schon so, nun soll das 20 Jahre ältere Pascal-Paket nachziehen.

Nochmal danke für den Tip von wp_xyz

Ich habe zuletzt zur Entwickung
-> Lazarus 1.6.4 mit Pascal 3.0.2
-> unter Windows XP aber dieses als eine Oracle Virtual Maschine
-> in Linux Mint 17
benutzt.

Nicht lachen, das geht nicht anders, weil ich für Turbo-Pascal und Borland halt eine
32-bit Umgebung brauche (zum Testen der 16bit-Teile dann sogar dort noch die DOSBOX 0.74)
und weil außerdem der Computer mit einer Windows-Hardware-Allergie krank ist (ist wirklich so,
Windows egal wie, will einen toten Grafikkarten-Lüfter und stirbt, Linux dagegen läuft wie
die Hummel, die nicht weiß daß sie nicht fliegen kann).

Die Programme laufen aber auch unter Windows 7.

Und ja, ich habe noch mehr Sprüche, so etwa 12.000 derzeit, suche aber immer gerne neue.
Dateianhänge
sprueche.zip
Quelltexte
(979.07 KiB) 56-mal heruntergeladen

Antworten