Tastaturabrage: deutsche Umlaute, utf8-codiert (gelöst)

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
guennid
Beiträge: 59
Registriert: Sa 9. Aug 2008, 10:19

Tastaturabrage: deutsche Umlaute, utf8-codiert (gelöst)

Beitrag von guennid »

Kann mir bitte jemand sagen, wie man den Druck auf eine Umlauttaste auf einer deutschen Tastatur mit freepascal abfragt, wenn das system (debian lenny) auf utf-8 funktioniert.

Vielen Dank, guennid
Zuletzt geändert von guennid am So 14. Aug 2011, 18:58, insgesamt 1-mal geändert.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Tastaturabrage: deutsche Umlaute, utf8-codiert

Beitrag von Socke »

Arbeitest du mit der LCL? Dann gibts in der Regel ein UTF8KeyPress- oder KeyPressUTF8-Event (oder so ähnlich). Falls du direkt auf der Konsole arbeitest, überlass ich die Antwort anderen, die sich mehr damit auskennen, oder google.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

guennid
Beiträge: 59
Registriert: Sa 9. Aug 2008, 10:19

Re: Tastaturabrage: deutsche Umlaute, utf8-codiert

Beitrag von guennid »

Ich arbeite auf der Konsole. Gegoogelt habe ich, ziemlich heftig sogar, aber nichts gefunden. Vielleicht hat jemand bessere Suchbegriffe.

Grüße, guennid

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1620
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Tastaturabrage: deutsche Umlaute, utf8-codiert

Beitrag von corpsman »

So RIchtig ahnung habe ich auch nicht, aber liest du in der Konsole Byte weise ?

UTF8 Zeichnet sich ja dadurch aus, dass das High Bit 1 ist wenn noch weiter gelesen werden muss.

Also wenn du ein ä lesen willst ist deine Eingabe erst mal ein wert >=128 und dann niedriger. Evtl hilft dir das ja weiter..
--
Just try it

guennid
Beiträge: 59
Registriert: Sa 9. Aug 2008, 10:19

Re: Tastaturabrage: deutsche Umlaute, utf8-codiert

Beitrag von guennid »

Nee, nee, das 'ä' offenbart sich, wenn man's denn hat, als Kombination von #195 #164. Mein Problem ist: wie krieg ich,s, z.B. mit readkey.

Grüße, guennid

guennid
Beiträge: 59
Registriert: Sa 9. Aug 2008, 10:19

Re: Tastaturabrage: deutsche Umlaute, utf8-codiert

Beitrag von guennid »

Für die Umlaute und ß scheint das hier zu funktionieren:

Code: Alles auswählen

Var
  taste : WIDECHAR;
  tstStr : STRING[2];
 
taste := #0;tstStr := '';
taste := READKEY;
tststr := tstStr+taste;
if taste = #195 THEN taste := READKEY;
tststr := tstStr+taste;
Kann das jemand bestätigen oder war das Zufall?
Besteht Optimierungsbedarf?

Grüße, guennid

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Tastaturabrage: deutsche Umlaute, utf8-codiert

Beitrag von Socke »

guennid hat geschrieben:Kann das jemand bestätigen oder war das Zufall?
Ich hab’s gerade bei mir überprüft. Die Buchstaben werden UTF-8 kodiert an das Programm übergeben. ReadKey liest dann immer ein Byte ein; bei Zeichen über $7F müssen also entsprechend mehr Bytes gelesen werden.

Edit:
Ich habe gerade mal eine Funktion implementiert, die in UTF-8 kodierte Eingaben erfordert. Keine Angst, das meiste sind Kommentare.

Code: Alles auswählen

program buchstaben;
 
uses
  // ohne WideString-Manager kann man nicht nach WideChar konvertieren;
  crt, cwstring;
 
function ReadUTF8Key: WideChar;
var
  // das erste Byte gibt die Anzahl der Bytes in diesem Zeichen
  // für UTF-8 sind aber maximal 4 Bytes spezifiziert
  s: array[0..3] of byte;
  i: byte;
begin
  s[0] := Byte(ReadKey);
  // Wenn das erste Zeichen ein Multi-Byte-Zeichen ist (erstes Bit gesetzt),
  // gehen wir davon aus, dass dies auch wirklich das erste Byte des Zeichens
  // ist. Der Benutzer muss also dafür sorgen, dass keine anderen Daten
  // (oder angeschnittene Buchstaben) im Tastaturpuffer liegen.
  if ord(s[0]) <= $7F then
    ReadUTF8Key := Char(s[0])
  else
  // Nach dem ersten Bit folgen maximal drei Bits, die angeben, wie viele
  // Bytes noch folgen; jedes Bit steht für ein weiteres Byte. Danach kommt
  // eine 0 und der Rest des Bytes gehört schon zu den Daten
  begin
    i := 1;
    while (i <= 3) and bytebool((s[0] shl i) and %10000000) do
    begin
      s[i] := Byte(ReadKey);
      inc(i);
    end;
    // i ist jetzt der Anzahl gelesener Zeichen
    // Zeichenfolge in WideChar konvertieren; der ist einfacher zu handhaben
    Utf8ToUnicode(@ReadUTF8Key, 1, @s[0], i);
  end;
end;
 
var
  c: UnicodeChar;
begin
  write('Bitte Buchstaben eingeben: ');
  c := ReadUTF8Key;
  writeln(c);
end.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

guennid
Beiträge: 59
Registriert: Sa 9. Aug 2008, 10:19

Re: Tastaturabrage: deutsche Umlaute, utf8-codiert

Beitrag von guennid »

Danke sehr!

Ich versteh aber nur die Hälfte. Viele Bezeichner sind völlig neu für mich (habe bisher nur Borland Pascal unter DOS benutzt):
cwstring, unicodechar, bytebool, shl, %10000000. Was macht man mit @?

Ist das irgendwo dokumentiert, wenn möglich in Deutsch? Ich habe hier zwar die deutsche Übersetzung eines "Originalhandbuches" für freepascal, aber das ist nicht das frischeste.

Grüße, guennid

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Tastaturabrage: deutsche Umlaute, utf8-codiert

Beitrag von Socke »

guennid hat geschrieben:Ist das irgendwo dokumentiert, wenn möglich in Deutsch? Ich habe hier zwar die deutsche Übersetzung eines "Originalhandbuches" für freepascal, aber das ist nicht das frischeste.
Die Übersetzung des Handbuches (Free Pascal 2 beim C&L-Verlag) ist wirklich nicht da Beste, aber leider das einzig größere Werk auf Deutsch. Auf Englisch gibts die offizielle Dokumentation unter http://www.freepascal.org/docs-html/; da sind vor allem die Sprachreferenz und die Dokumentation zur Run Time LIbrary (RTL) zu nennen.
Ich versuch das mal zu erklären:
guennid hat geschrieben:Ich versteh aber nur die Hälfte. Viele Bezeichner sind völlig neu für mich (habe bisher nur Borland Pascal unter DOS benutzt):
cwstring, unicodechar, bytebool, shl, %10000000. Was macht man mit @?
bytebool
Ist ein Datentyp für Wahrheitswerte und ist wie der Typ Boolean auch ein Byte groß. Bei Boolean gibts die direkten Entsprechungen True = -1 und False = 0; Für bytebool ist nur False = 0 festgelegt, woraus folgt, dass alles, was nicht 0 ist, True ergibt.

Die Schleife überprüft also die Bits 1 bis 3 (das erste Bit hat den Index 0), ob diese 1 sind und ließt dann entsprechend die weiteren Bytes des UTF-8 Zeichens.

cwstring, unicodechar
Normalerweise werden Zeichenketten in AnsiStrings gespeichert. Die gehen davon aus, dass jedes Zeichen in einem Char (Größe 1 Byte) Platz findet. Bei ASCII oder auch ANSI kodierten Zeichenketten funktioniert das wunderbar, aber mit Unicode nicht mehr (UTF-8 ist nur eine Möglichkeit Unicode-Zeichen zu speichern). Für Unicode gibt es WideChar und WideString bzw. UnicodeChar und UnicodeString. In diesen Typen wird das Zeichen in UTF-16 kodiert. UnicodeStrings werden im Gegensatz zu WideStrings über eine Referenz gezählt (genau wie die AnsiStrings).
Damit zwischen verschiedenen Kodierungen (UTF-8, UTF-16, ANSI, und so weiter) umkodiert werden kann, benötigt man einen WideString-Manager (eine Sammlung von Funktionen; es gibt noch weitere Manager für den Speicher oder auch für die AnsiStrings). Windows stellt selbst einen zur Verfügung, unter Linux muss man den aus der C-Standard-Library explizit durch die Unit cwstring einbinden.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

guennid
Beiträge: 59
Registriert: Sa 9. Aug 2008, 10:19

Re: Tastaturabrage: deutsche Umlaute, utf8-codiert

Beitrag von guennid »

Nochmals dake!

Den Link habe ich mir angesehen. Ich kann zwar nicht besonders gut Englisch, aber es wird gehen.
Ich habe merkwürigerweise keine Erkärungen zu WIDECHAR gefunden.

In dem Zusammenhang tauchte bei mir ein neues Problem auf:

Var zeichen:WIDECHAR;

zeichen := 'd';
zeichen := UPCASE(zeichen); //bringt das 'D' in der Ausgabe
Aber ich habe keine Möglichkeit gefunden, mir die Nummer des 'D's zu holen, also das, was man bei BP mit ORD() macht. Es wird partout 68 ausgegeben, also die Nummer des 'd's.

Grüße, Günther

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

Re: Tastaturabrage: deutsche Umlaute, utf8-codiert

Beitrag von theo »

guennid hat geschrieben: Aber ich habe keine Möglichkeit gefunden, mir die Nummer des 'D's zu holen, also das, was man bei BP mit ORD() macht. Es wird partout 68 ausgegeben, also die Nummer des 'd's.
Ich verstehe die Frage nicht ganz.
Du kannst den "Wert" des "zeichen" z.B. so in String umwandeln:

Code: Alles auswählen

Inttostr(Word(zeichen));
Aber ich weiss nicht ganz wozu. Riecht nach Holzweg. Dezimal 68 ist übrigens richtig (entspr. Hex 44)

Kleiner Tipp: Unicode ist nicht geeignet für den "Versuch und Irrtum" Ansatz.
Das scheint manchmal nur zu funktionieren. Man sollte sich erst etwas damit befassen.

guennid
Beiträge: 59
Registriert: Sa 9. Aug 2008, 10:19

Re: Tastaturabrage: deutsche Umlaute, utf8-codiert

Beitrag von guennid »

Nun ja, wenn man, wie ich hier, stundenlang den "Wert" für den Großbuchstaben mit dem für den Kleinbuchstaben verwechselt und einem das partout nicht auffällt, dann hilft wohl alle "Beschäftigung" nicht weiter. :oops: :oops: :oops:
68 ist übrigens richtig
hat die Blockade gelöst, danke!

Ich wollte kein Integer in einen String umwandeln, sondern lediglich prüfen, ob die gedrückte Taste einem bestimmten Buchstaben unabhängig von der Groß- oder Kleinschreibung entspricht.

Finde ich in sockes Link etwas über WIDECHAR?

Grüße, guennid
Zuletzt geändert von guennid am So 14. Aug 2011, 15:38, insgesamt 1-mal geändert.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Tastaturabrage: deutsche Umlaute, utf8-codiert

Beitrag von Socke »

guennid hat geschrieben:Finde ich in sockes Link etwas über WIDECHAR?
Ja, aber nicht viel. Sprachreferenz zu WideStrings
Free Pascal Sprachreferenz hat geschrieben:A WideChar is a two-byte character (an element of a DBCS: Double Byte Character Set)
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: Tastaturabrage: deutsche Umlaute, utf8-codiert

Beitrag von theo »

guennid hat geschrieben: Finde ich in sockes Link etwas über WIDECHAR?
WideChar ist afaik nichts besonderes. Nur ein Datentyp mit einer Word Grösse (2*Byte), statt wie bei Char (1*Byte).
Damit lässt sich ein UCS-2 resp. UTF-16 Zeichen (oder code point) repräsentieren.

Antworten