Tastaturabrage: deutsche Umlaute, utf8-codiert (gelöst)
Tastaturabrage: deutsche Umlaute, utf8-codiert (gelöst)
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
Vielen Dank, guennid
Zuletzt geändert von guennid am So 14. Aug 2011, 18:58, insgesamt 1-mal geändert.
-
- 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
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
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Re: Tastaturabrage: deutsche Umlaute, utf8-codiert
Ich arbeite auf der Konsole. Gegoogelt habe ich, ziemlich heftig sogar, aber nichts gefunden. Vielleicht hat jemand bessere Suchbegriffe.
Grüße, guennid
Grüße, guennid
- 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
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..
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
Just try it
Re: Tastaturabrage: deutsche Umlaute, utf8-codiert
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
Grüße, guennid
Re: Tastaturabrage: deutsche Umlaute, utf8-codiert
Für die Umlaute und ß scheint das hier zu funktionieren:
Kann das jemand bestätigen oder war das Zufall?
Besteht Optimierungsbedarf?
Grüße, guennid
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;
Besteht Optimierungsbedarf?
Grüße, guennid
-
- 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
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.guennid hat geschrieben:Kann das jemand bestätigen oder war das Zufall?
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
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Re: Tastaturabrage: deutsche Umlaute, utf8-codiert
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
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
-
- 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
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.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.
Ich versuch das mal zu erklären:
byteboolguennid 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 @?
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
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Re: Tastaturabrage: deutsche Umlaute, utf8-codiert
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
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
Re: Tastaturabrage: deutsche Umlaute, utf8-codiert
Ich verstehe die Frage nicht ganz.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.
Du kannst den "Wert" des "zeichen" z.B. so in String umwandeln:
Code: Alles auswählen
Inttostr(Word(zeichen));
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.
Re: Tastaturabrage: deutsche Umlaute, utf8-codiert
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.
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



hat die Blockade gelöst, danke!68 ist übrigens richtig
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.
-
- 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
Ja, aber nicht viel. Sprachreferenz zu WideStringsguennid hat geschrieben:Finde ich in sockes Link etwas über WIDECHAR?
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
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Re: Tastaturabrage: deutsche Umlaute, utf8-codiert
WideChar ist afaik nichts besonderes. Nur ein Datentyp mit einer Word Grösse (2*Byte), statt wie bei Char (1*Byte).guennid hat geschrieben: Finde ich in sockes Link etwas über WIDECHAR?
Damit lässt sich ein UCS-2 resp. UTF-16 Zeichen (oder code point) repräsentieren.