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.
