[gelöst]Readln und Umlaute

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]Readln und Umlaute

Beitrag von Marsmännchen »

Hi,

ich habe soeben mit freundlicher Hilfe von euch das hinbekommen, dass meine Windowskonsole Umlaute korrekt ausgibt (wen's interessiert, hier: http://www.lazarusforum.de/viewtopic.php?f=55&t=9412).
Nun bin ich fröhlich zu meiner nächsten Übungsaufgabe fortgeschritten, in welcher Umlaute aus einem eingelesenen Wort ersetzt werden sollen (also ä = ae; ö = oe usw.).
Den Quellcode habe ich eingegeben und ... er funktioniert net. Das Problem liegt daran, dass zwar auf der Konsole jetzt alles hübsch dargestellt wird, aber Readln nimmt die Umlaute nicht korrekt entgegen. Wenn ich 'Bücherstoß' eingebe, kommt im Programm 'B?chersto?' an. Daraufhin läuft natürlich die Prüfroutine auf Umlaute ins Leere.
Ich hatte irrtümlich gedacht, dass SetConsoleCP() aus der Windows-Unit in beide Richtungen funktioniert (also für Aus- und Eingabe). Tut es aber nicht. Wißt ihr, wie ich Readln auf Linie kriege?

Hier der Quellcode:

Code: Alles auswählen

 
program UmlautCheck;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, Crt, Windows
  { you can add units after this };
 
var
   wort  : String;
   ch    : Char;
   z     : Byte;
 
begin
  ClrScr;
  SetConsoleCP(1252);
  Repeat
    Write(UTF8ToAnsi('Gib ein Wort mit Umlauten oder ß ein: '));
    Readln(wort);
    z := 0;
    if wort <> '' then
    Repeat
      Inc(z);
      ch := wort[z];
      if ch in [#132, #148, #129, #142, #153, #154, #225] then begin
        Delete(wort, z, 1);
        Case ch of
          #132: Insert('ae', wort, z);
          #148: Insert('oe', wort, z);
          #129: Insert('ue', wort, z);
          #142: Insert('Ae', wort, z);
          #153: Insert('Oe', wort, z);
          #154: Insert('Ue', wort, z);
          #225: Insert('ss', wort, z);
        end;
      end;
 
    until z = Length(wort) ;
    Writeln(wort);
  until wort = '' ;
 
end.
 
 
Wenn ich die Crt-Unit (natürlich nebst ClrScr) und SetConsoleCP rausnehme, funktioniert das Programm übrigens tadellos! Außer, dass er mir das 'ß' in dem Eingabe-Write ('Gib ein Wort...') nicht richtig darstellt. Allmählich neige ich dazu, Zeichencodierung für Vodoo zu halten :cry:
Zuletzt geändert von Marsmännchen am Mi 3. Feb 2016, 16:37, insgesamt 1-mal geändert.
Ich mag Pascal...

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

Re: Readln und Umlaute

Beitrag von Michl »

Ich will dir zwar nicht die Laune verderben, aber diese Beispiele funktionieren nicht plattformübergreifend, ja nicht einmal windowsversionsübergreifend. Noch schlimmer, es gibt ein neuen stabilen FPC, der die Stringverarbeitung nochmal anders handhabt. MMn wäre es sinnvoller sich voll auf das Verständniss der neuen Strings und insbesondere auf Strings, die UTF8 kodiert sind, zu stürzen, als solche Beispiele durchzuarbeiten. Ist aber nur meine persönliche Meinung.

Trotzdem, um etwas zu entwirren, mit

Code: Alles auswählen

  SetConsoleCP(1252);
setzt du eine neue Codepage, nämlich Codepage 1252. Dort ist z.B. das ä als Codepoint 228 gespeichert.

Im Code müsstest du die Zeichen entsprechend der aktuell gesetzten Codepage wählen

Code: Alles auswählen

      if ch in [#228, ...] then begin
        Delete(wort, z, 1);
        Case ch of
          #228: Insert('ae', wort, z);
Marsmännchen hat geschrieben:Wenn ich 'Bücherstoß' eingebe, kommt im Programm 'B?chersto?' an.
Ich nehme an, das hast du im Debugger so gesehen. In diesem Fall ist der Debugger der Schuldige, weil er die Konvertierung nicht richtig vorgenommen hat.

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: Readln und Umlaute

Beitrag von Marsmännchen »

Hi,

ich habe jetzt die Codepoints korrigiert und es läuft tadellos. Darauf muss man erstmal kommen, vor allem, wenn einen der böse, böse Debugger :wink: in die Irre führt. Danke erstmal.

Zu deinen weiteren Anmerkungen: vermutlich hast du nicht Unrecht. Allerdings kosten die FPC und Lazarus Bücher beide Richtung 50 Euro und das ist schon heftig (okay, Computerbücher sind immer satt teuer, ich weiß das, weil ich sehr gerne solches Zeugs lese). Um mir erstmal die Grundlagen von Pascal beizubringen bin ich daher auf Gebrauchtbücher ausgewichen. Die habe ich z.T. für 0.97 Euro bekommen. Ich habe mir vorgenommen, daraus wirklich nur die Basics zu lernen (Variablenhandling, Prozeduren usw.) und zu ignorieren, wenn was nicht klappt. Genau in die Falle bin ich jetzt mit den Umlauten reingetappt.
Ich sollte also brav bei meiner Linie bleiben und zB die Umlautproblematik nicht weiter verfolgen. Später dann müsste ich dann das neue Stringhandling um so mehr schätzen :mrgreen:

Liebe Grüße vom Mars
Ich mag Pascal...

Antworten