[gelöst]Umlaute und WinCrt

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

[gelöst]Umlaute und WinCrt

Beitrag von Marsmännchen »

Hallo,
ich beschäftige mich seit längerem wieder mal mit Lazarus (1.4.4 auf Windows 8.1). Beim Schreiben meiner Übungsprogramme stieß ich natürlich recht rasch auch auf die üblichen Umlautprobleme. Über das Forum und Internetsuche stieß ich recht schnell auch auf Lösungen (UTF8 - Ansi-Problematik). Natürlich habe ich nicht gleich alles verstanden.
Ich habe jetzt ein Übungsprogramm (aus der einem alten Turbo Pascal Buch), das in der Konsole Daten über Readln einliest. Erstellt habe ich es über "Neues Projekt - Programm") Und plötzlich gab mir die Konsole beim Eintippen der Daten schon Umlautmüll aus (komische Zeichen, Klötzchen etc.). Wohlgemerkt nicht bei der Datenausgabe, sondern bei der Eingabe! Nach vielem Suchen wollte ich das Problem hier schon posten (obwohl es ja schon viel Stoff zum Thema Umlaute usw. gibt). Hierzu schrieb ich ein kleines Demoprogrämmchen und siehe da: Plötzlich zeigte mir die Konsole bei der Eingabe die Umlaute korrekt an!!!
Da stand ich nun, wie das Alien auf der Reeperbahn und kam nicht rein. Bis ich feststellte das ich auf Wunsch meines alten Pascalbuchs (1996) Crt eingebunden hatte für ClrScr, GotoXY usw. Und in meinem kleinen Demoprogrämmchen war es nicht. Lag also am Crt. Wat nu? Ich habe gelesen, dass es auch eine WinCrt-Unit gibt. Also habe ich die in mein Übungsprogramm eingebunden. Auf einmal hagelte es Fehlermeldungen beim Kompilieren. Der Kompiler fand die ganzen Crt-Funktionen nicht mehr. Er meckerte aber nicht darüber, dass ich WinCrt eingebunden hatte!? Nur die Identifier fand er nicht.
Mir ist nun völlig unklar, was ich machen muss. Über WinCrt habe ich in der Referenz auf Freepascal.org habe ich dann gelesen:
The wincrt unit provides some auxiliary routines for use with the graph unit, namely keyboard support. It has no connection with the crt unit, nor with the Turbo-Pascal for Windows WinCrt unit. As such, it should not be used by end users.
.
Was kann ich also tun, wenn ich keine Huddeleien mit Umlauten bei Konsolenanwendungen haben will, andererseits aber Crt-Funktionalität benötige.
Als Anfänger sollte man sich vielleicht noch nicht mit dem ganzen UFT8-Kram verrückt machen (man kann ja auch 'ae', 'ue', 'ss' usw. erstmal verwenden). Aber jetzt habe ich damit angefangen und hätte natürlich gerne auch eine Lösung.
Bitte Hilfe...
Zuletzt geändert von Marsmännchen am Mi 3. Feb 2016, 15:00, insgesamt 1-mal geändert.
Ich mag Pascal...

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Umlaute und WinCrt

Beitrag von Michl »

Bei mir funktioniert ein einfaches Konsolenprogramm (Lazarus 1.4.0 Windows 7):

Code: Alles auswählen

program project1;
 
uses crt;
 
var
  s: String;
 
begin
  ReadLn(s);
  ClrScr;
  WriteLn('Teste öäü: ', s);
  ReadLn;
end.
Das einzigste Problem, was ich damit hatte, war, dass der String Teste öäü als UTF8 in der Projektdatei codiert war und somit die hinter dem UTF8-Zeichen liegenden Bytes angezeigt wurden. Als ich die Kodierung der Projektdatei (Quelltexteditor -> Rechtsklick -> Dateieinstellungen -> Zeichenkodierung -> CP850) auf den Zeichensatz umgestellt hatte, die die Console verwendet, wurden auch die "richtigen" Character angezeigt.

PS1: Evtl. verwendet Windows 8 einen anderen Zeichensatz für die Konsole als Windows 7 (hier Codepage 850) und Crt geht aber von diesem aus.
PS2: Da ich kein anderes Verhalten mit/ohne der Verwendung der Unit Crt feststellen kann, würde mich das Testprojekt schon interessieren.
PS3: Mit FPC 3.0.0 wird eine Codepagekonvertierung um einiges einfacher als mit FPC 2.6.4.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

Re: Umlaute und WinCrt

Beitrag von Marsmännchen »

Hallo,

danke für deine Hinweise.

Ich habe die Quelltextdatei auf CP850 umgestellt. Hat leider nichts gebracht. Von FP 3.0 habe ich auch schon gelesen. Kommt hoffentlich bald raus.

Hier mein Quellcode (aus Markt&Technik: Turbo Pascal 7.0 Das Kompedium 1996):

Code: Alles auswählen

program Textsort;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, Crt
  { you can add units after this };
 
VAR
  feld     : Array[0..100] of String;
  n, anzahl: Byte;
  x, y     : Byte;
 
begin
  ClrScr; n := 0;
  Repeat
    Inc(n);
    Write(n,': ');
    Readln(feld[n]);
  until (feld[n] = '') or (n >= 100) ;
  GotoXY(1,WhereY-1); DelLine;
  anzahl := n-1;
  x := 0;
  While x < anzahl-1 do begin
    Inc(x); y := x;
    Repeat
      Inc(y);
      if feld[x] > feld[y] then begin
        feld[0]:=feld[x];     // feld[0] ist temp-Feld!
        feld[x]:=feld[y];
        feld[y]:=feld[0]
      end;
    until y = anzahl ;
  end;
  Window(40,1,80,25);
  For n:=1 to anzahl do
      Writeln(n:3, ' ', UTF8ToAnsi(feld[n]));
  Write(^j,'<Enter>'); Readln;
end.
 
Anbei noch die Ausgabe:
Bild

Edit: Ich habe mal noch andere Codierungen des Editors ausprobiert (Ansi, ISO 8859-1), hat aber für die Ausgabe auch nix gebracht. Es erscheinen immer die gleichen kruden Zeichen...
Ich mag Pascal...

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Umlaute und WinCrt

Beitrag von Michl »

Ok, habe es eben auf einem Windows 10 Rechner mit Lazarus 1.4.4 probiert. Dort sehe ich das von dir beschriebene Verhalten. Ich habe zwar lange nichts mehr mit FPC 2.6.4 gemacht, schaue aber mal, melde mich dann.

PS:

Code: Alles auswählen

      Writeln(n:3, ' ', UTF8ToAnsi(feld[n]));
Das passt nicht. Die Zeichen in der Console sind nicht als UTF8 kodiert (das müsste man explizit einschalten). Nehme ich das UTF8ToAnsi raus, läuft das gepostete Programm unter Windows 7 (zumindest die Kodierung).

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

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

Re: Umlaute und WinCrt

Beitrag von theo »

Habe hier nicht alles gelesen aber was wäre damit?
http://wiki.lazarus.freepascal.org/Cons ... .29_output

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Umlaute und WinCrt

Beitrag von Michl »

theo hat geschrieben:Habe hier nicht alles gelesen aber was wäre damit?
http://wiki.lazarus.freepascal.org/Cons ... .29_output
Fast, danke für den Hinweis!

Code: Alles auswählen

uses ..., Windows;
...
begin
  SetConsoleCP(1252);
funktioniert bei Lazarus 1.4.4 unter Windows 10 mit der Unit Crt.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

Re: Umlaute und WinCrt

Beitrag von Marsmännchen »

Hi,

funktioniert bei mir leider nicht :(
Ich habe Windows und SetConsoleOutputCP eingefügt.

Code: Alles auswählen

 
...
Classes, Crt, Windows
  { you can add units after this };
 
VAR
  feld     : Array[0..100] of String;
  n, anzahl: Byte;
  x, y     : Byte;
 
begin
 
  SetConsoleOutputCP(1252);
  ...                                
(Habe unten die UTFToAnsi() rausgenommen, war ein Überbleibsel meiner vorherigen Versuche...)
Immer noch die gleichen Wurselzeichen. Ich habe bei SetConsoleOutputCP die Codepages 1252, 850, 431 und CP_UTF8 ausprobiert. Immer nur Müll. Ich habe die Codierung des Editors auf Ansi gesetzt. Hat auch nix gebracht.
Ich hab mir außerdem mal die Definition der WinCrT angesehen. Da sind tatsächlich nicht die Crt-Funktionen drin, die ich brauche. WinCrt brächte mich also auch nicht weiter.
...seufz. Danke für eure Mühe. Habt ihr noch Ideen?
Ich mag Pascal...

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Umlaute und WinCrt

Beitrag von Michl »

Marsmännchen hat geschrieben:funktioniert bei mir leider nicht :(
Ich habe Windows und SetConsoleOutputCP eingefügt.
Ähm, ich hatte im letzten Post was anderes geschrieben.

Code: Alles auswählen

  SetConsoleOutputCP(1252);
sollte

Code: Alles auswählen

  SetConsoleCP(1252);
lauten.
Zuletzt geändert von Michl am Mi 3. Feb 2016, 13:59, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

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

Re: Umlaute und WinCrt

Beitrag von theo »

Nicht dass ich hier den Überblick hätte, aber warum eigentlich UTF8ToAnsi() und nicht UTF8ToConsole() ?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Umlaute und WinCrt

Beitrag von Michl »

theo hat geschrieben:Nicht dass ich hier den Überblick hätte, aber warum eigentlich UTF8ToAnsi() und nicht UTF8ToConsole() ?
Warum die LCL Abhängig in eine Konsoleanwendung holen? Bzw. wie ich oben schrieb, ist eine Konvertierung überhaupt nicht notwendig, da man nur die richtige Konsolecodepage verwenden muss. Diese kann man sich frei einstellen.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

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

Re: Umlaute und WinCrt

Beitrag von theo »

Michl hat geschrieben:
theo hat geschrieben:Nicht dass ich hier den Überblick hätte, aber warum eigentlich UTF8ToAnsi() und nicht UTF8ToConsole() ?
Bzw. wie ich oben schrieb, ist eine Konvertierung überhaupt nicht notwendig, da man nur die richtige Konsolecodepage verwenden muss. Diese kann man sich frei einstellen.
Das denke ich eig. auch. Dachte nur, dass es mit ToAnsi eher sowieso nicht geht.

Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

Re: Umlaute und WinCrt

Beitrag von Marsmännchen »

Michl hat geschrieben:
Marsmännchen hat geschrieben:funktioniert bei mir leider nicht :(
Ich habe Windows und SetConsoleOutputCP eingefügt.
Ähm, ich hatte im letzten Post was anderes geschrieben.

Code: Alles auswählen

  SetConsoleOutputCP(1252);
sollte

Code: Alles auswählen

  SetConsoleCP(1252);
lauten.
... ich sehe grade ganz, ganz viele Sterne... :shock: hätte wohl mit der Stirn nicht so oft auf die Tischkante hauen sollen... :mrgreen:

Oh Mann, wer lesen kann ist klar im Vorteil :oops: ! Jetzt funzt es, das es eine Pracht ist. Möchte momentan nix anderes schreiben, als lauter wunderbare Umlaute.

Danke sehr! :D
Ich mag Pascal...

Antworten