Array mit keycodes -> Array mit UTF-8 Eingaben -> Array mit CP437 (wobei der Pfeil fürs mappen stehen soll)
Das ist eine eher schlechte Idee, denn dann kannst du auch direkt Keycodes -> CP437 mappen und auf UTF-8 verzichten.
Wenn du UTF-8 Unterstützung einbauen willst, dann baue sie am besten so ein, dass
alles intern mit UTF-8 arbeitet. Das heißt, dass dein Tastaturtreiber "Keycode -> UTF-8" wandelt und deine Konsole "UTF-8 -> CP437". Das heißt auch, dass alle API-Funktionen, die irgendwas mit Strings zu tun haben, UTF-8 nehmen - auch kprintf(). Du musst aber keinen vollständigen Unicode-Support anbieten.
Dann habe ich noch eine Frage zu den Funktionstasten. Enter, Tab und Return (\n, \t, \r) umzusetzen habe ich hinbekommen. Wie mache ich das jetzt bei Tasten die nicht so eine Escapesequenz haben?
Da gibt es mehrere Möglichkeiten:
(a) Du kannst die Tasten ignorieren und eine zusätzliche API anbieten, die mit Keycodes arbeitet. Das ist die beste Methode, wenn du an z.B. Multimedia-Tastaturen oder andere Eingabegeräte mit irgendwelchen Sondertasten denkst. Dafür hast du dann zwei Programmierschnittstellen.
(b) Alle diese Tasten haben ein Logo aufgedruckt, und dieses Logo gibt es auch als Unicode-Zeichen, z.B. U+2190 ist "Pfeil nach links". In UTF-8 wäre das dann die Bytesequenz 0xE2 0x86 0x90. Die kannst du nehmen.
(c) Unicode reserviert in der Basic Multilingual Plane (BMP) den Bereich U+E000 bis U+F8FF für "private Nutzung", d.h. dort wird nie ein Zeichen standardisiert werden. Du kannst allen Sondertasten ein Zeichen aus diesem Bereich zuweisen.
(d) Du kannst ein anderes Codeschema nutzen. Die Konsole unter Linux bildet grob ein ANSI-Terminal nach (bzw. ein Subset von VT102/VT220). Solche Terminals (Bildschirm, Tastatur und serielle Schnittstelle) wirst du allerdings kaum noch finden. Daher kommen die ANSI-Codes, die kevin beschrieben hat. Der Nachteil an ANSI-Codes ist, dass sie alle mit einem ESC-Zeichen beginnen und damit von einem Druck auf die ESC-Taste nicht ordentlich zu unterscheiden sind.
Bedenke, dass UTF-8 mehrere Bytes für ein Zeichen benutzen kann, was so Dinge wie "ein Zeichen rückwärts gehen" wesentlich komplizierter macht als ein z.B. single-byte Zeichensatz. Aus diesem Grund nutzt Windows intern durchgängig UTF-16, womit allerdings nur die BMP abgedeckt werden kann (das war Anfang der 90er noch kein Problem). Mit UTF-32 hast du damit keine Probleme, dafür brauchen normale ASCII-Texte viermal so viel Speicher.
Gruß,
Svenska