Frage: Ein-/Ausgabe von Sonderzeichen
Frage: Ein-/Ausgabe von Sonderzeichen
Hallo zusammen,
ich versuche gerade ein altes Delphi 2006 Programm mit Lazarus ans Laufen zu bringen.
Leider gibt es Probleme mit den Sonderzeichen bei der Bildschirm- und Dateiausgabe.
Ich habe folgendes kleine Testprogramm erstellt, dass das Problem erklären soll.
Wer kennt sich hier damit aus und kann mir bitte helfen?
Vorgehensweise (Windows 10):
1. Lazarus neu installiert.
2. Neues Projekt CP als "Einfaches Programm' erstellt.
3. Den nachfolgenden Code eingetippt und eine Datei s:\file.txt (Inhalt: Büros im Anhang) erstellt.
4. Mit dem grünen > laufen lassen.
5. Ergebnis: siehe Screenshot Ausgabe im Anhang
FRAGE: Was muss ich tun, um die Umlaute und das Sonderzeichen zu sehen?
Ich habe schon Stunden gesucht.
In Delphi geht das Out of the box!
Vielen Dank.
Hier ist das Projekt CP:
program CP1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}
cthreads,
{$ENDIF}
Classes
{ you can add units after this };
procedure ShowFile();
var
t: Text;
s: String;
begin
Assign(t, 's:\CP\file.txt');
Reset(t);
while not EOF(t) do begin
Readln(t, s);
writeln('>' + s + '<'); //should be >Büros<
end;
Close(t);
end;
begin
Writeln('Hallo Ü'); //Deutscher Umlaut?
WriteLn('10 ≥ 1'); //UTF8 Zeichen?
ShowFile();
ReadLn;
end.
ich versuche gerade ein altes Delphi 2006 Programm mit Lazarus ans Laufen zu bringen.
Leider gibt es Probleme mit den Sonderzeichen bei der Bildschirm- und Dateiausgabe.
Ich habe folgendes kleine Testprogramm erstellt, dass das Problem erklären soll.
Wer kennt sich hier damit aus und kann mir bitte helfen?
Vorgehensweise (Windows 10):
1. Lazarus neu installiert.
2. Neues Projekt CP als "Einfaches Programm' erstellt.
3. Den nachfolgenden Code eingetippt und eine Datei s:\file.txt (Inhalt: Büros im Anhang) erstellt.
4. Mit dem grünen > laufen lassen.
5. Ergebnis: siehe Screenshot Ausgabe im Anhang
FRAGE: Was muss ich tun, um die Umlaute und das Sonderzeichen zu sehen?
Ich habe schon Stunden gesucht.
In Delphi geht das Out of the box!
Vielen Dank.
Hier ist das Projekt CP:
program CP1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}
cthreads,
{$ENDIF}
Classes
{ you can add units after this };
procedure ShowFile();
var
t: Text;
s: String;
begin
Assign(t, 's:\CP\file.txt');
Reset(t);
while not EOF(t) do begin
Readln(t, s);
writeln('>' + s + '<'); //should be >Büros<
end;
Close(t);
end;
begin
Writeln('Hallo Ü'); //Deutscher Umlaut?
WriteLn('10 ≥ 1'); //UTF8 Zeichen?
ShowFile();
ReadLn;
end.
- Dateianhänge
-
- file.txt
- (8 Bytes) 43-mal heruntergeladen
-
- Ausgabe.png (3.47 KiB) 1078 mal betrachtet
-
- Beiträge: 6194
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Frage: Ein-/Ausgabe von Sonderzeichen
Das könnte weiter helfen.
viewtopic.php?t=8372
viewtopic.php?t=8372
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
- Jorg3000
- Lazarusforum e. V.
- Beiträge: 169
- Registriert: So 10. Okt 2021, 10:24
- OS, Lazarus, FPC: Win64
- Wohnort: NRW
Re: Frage: Ein-/Ausgabe von Sonderzeichen
Hi!
Bau mal nach dem Readln(t,s) folgende Zeile ein ... und uses LConvEncoding
Das ist aber nur eine Quick-and-dirty-Lösung. Besser wäre es den BOM in der Datei zu berücksichtigen, falls vorhanden, und ansonsten die Codepage des Betriebssystems zu verwenden, anstatt fest 1252.
Grüße, Jörg
Bau mal nach dem Readln(t,s) folgende Zeile ein ... und uses LConvEncoding
Code: Alles auswählen
s:=LConvEncoding.CP1252ToUTF8(s);
Grüße, Jörg
-
- Beiträge: 830
- Registriert: Mi 3. Jun 2020, 07:18
- OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
- CPU-Target: Aarch64 bis Z80 ;)
- Wohnort: München
Re: Frage: Ein-/Ausgabe von Sonderzeichen
FPC nutzt standardmäßig die CodePage des Systems für die Ausgabe. Wenn du also Text hast, der in UTF-8 kodiert ist (wie dein Text aussieht), dann musst du die RTL entsprechend einstellen. Füge mal am Beginn deines Programms ein SetMultiByteConversionCodePage(CP_UTF8) ein.
FPC Compiler Entwickler
Re: Frage: Ein-/Ausgabe von Sonderzeichen
Ja, Strings sind für den, der von Delphi wechselt, immer noch eines der schwierigeren Kapitel mit Lazarus, und das vor allem wenn man Konsolenprogramme schreibt, weil die Konsole bei Windows immer noch ein Eigenleben führt.
Also ich habe das Projekt gerade ausprobiert (Win 11, Laz/main und Laz 2.0.12), und so funktioniert es (bin aber nicht 100% sicher, ob es nicht einfacher geht).
Wenn du beim Kompilieren den Fehler "Unit LazUTF8 nicht gefunden" bekommst, hast du das LazUtils-Package nicht zum Projekt hinzugefügt (erste Schritt oben).
Also ich habe das Projekt gerade ausprobiert (Win 11, Laz/main und Laz 2.0.12), und so funktioniert es (bin aber nicht 100% sicher, ob es nicht einfacher geht).
- Öffne den Projekt-Inspektor (Menü Projekt), "+ Hinzufügen" > "Neue Anforderung", in der Liste das Package LazUtils auswählen -> "OK". Das Package erscheint im Objektbaum des Projekt-Inspektors. Das wird benötigt für den folgenden Schritt.
- Denn nun kannst du die Unit LazUTF8 der uses-Zeile hinzufügen. Dies installiert einen Widestring-Manager für FPC und definiert UTF8 als Codepage des Programms.
- Du brauchst noch die Unit Windows in der uses-Liste, ganz vorne bitte, sonst gibt es vielleicht mit anderen Units Probleme
- Schließen kommen die beiden folgenden Anweisungen noch an den Anfang des Programms:
Code: Alles auswählen
SetTextCodePage(Output, CP_UTF8); SetConsoleOutputCP(CP_UTF8);
Code: Alles auswählen
program cp1;
{$mode objfpc}{$H+}
uses
Windows, SysUtils, LazUTF8;
procedure ShowFile();
var
t: Text;
s: String;
begin
Assign(t, 'file.txt');
Reset(t);
while not EOF(t) do begin
Readln(t, s);
writeln('>' + s + '<'); //should be >Büros<
end;
Close(t);
end;
begin
SetTextCodePage(Output, CP_UTF8);
SetConsoleOutputCP(CP_UTF8);
Writeln('Hallo Ü'); //Deutscher Umlaut?
WriteLn('10 ≥ 1'); //UTF8 Zeichen?
ShowFile();
ReadLn;
end.
-
- Beiträge: 153
- Registriert: Sa 30. Jan 2010, 18:17
- OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: Frage: Ein-/Ausgabe von Sonderzeichen
Bei mir Windows10 und Lazarus 2.2.0 reicht folgendes aus (Aber nur für die Statische ausgabe, Datei geht so nicht):
Code: Alles auswählen
program project1;
uses Windows;
begin
SetConsoleOutputCP(CP_UTF8);
WriteLn('ÖÄÜöäüß');
WriteLn('10 ≥ 1'); //UTF8 Zeichen?
ReadLn();
end.
Re: Frage: Ein-/Ausgabe von Sonderzeichen
Vielen Dank für eure Unterstützung.
Ich habe die Lösung von wp_xyz verwendet und es läuft jetzt.
Ich habe die Lösung von wp_xyz verwendet und es läuft jetzt.