Frage: Ein-/Ausgabe von Sonderzeichen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
drheck
Beiträge: 2
Registriert: Mo 21. Nov 2022, 18:19

Frage: Ein-/Ausgabe von Sonderzeichen

Beitrag von drheck »

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.
Dateianhänge
file.txt
(8 Bytes) 43-mal heruntergeladen
Ausgabe.png
Ausgabe.png (3.47 KiB) 1078 mal betrachtet

Mathias
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

Beitrag von Mathias »

Das könnte weiter helfen.
viewtopic.php?t=8372
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
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

Beitrag von Jorg3000 »

Hi!
Bau mal nach dem Readln(t,s) folgende Zeile ein ... und uses LConvEncoding

Code: Alles auswählen

s:=LConvEncoding.CP1252ToUTF8(s);
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

PascalDragon
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

Beitrag von PascalDragon »

drheck hat geschrieben:
Mo 21. Nov 2022, 18:38
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!
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

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

Re: Frage: Ein-/Ausgabe von Sonderzeichen

Beitrag von wp_xyz »

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).
  • Ö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); 
Das komplette Programm wäre somit wie folgt:

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. 
Wenn du beim Kompilieren den Fehler "Unit LazUTF8 nicht gefunden" bekommst, hast du das LazUtils-Package nicht zum Projekt hinzugefügt (erste Schritt oben).

Thandor
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

Beitrag von Thandor »

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.      

drheck
Beiträge: 2
Registriert: Mo 21. Nov 2022, 18:19

Re: Frage: Ein-/Ausgabe von Sonderzeichen

Beitrag von drheck »

Vielen Dank für eure Unterstützung.
Ich habe die Lösung von wp_xyz verwendet und es läuft jetzt.

Antworten