Die Zeichen, die Sie eingeben möchten, erfordern das Programm zum Einrichten der Gebietsschema. Wie in den manual beschrieben:
Initialization
The library uses the locale which the calling program has
initialized. That is normally done with setlocale:
setlocale(LC_ALL, "");
If the locale is not initialized, the library assumes that
characters are printable as in ISO-8859-1, to work with
certain legacy programs. You should initialize the locale
and not rely on specific details of the library when the
locale has not been setup.
Vergangenheit, ist es wahrscheinlich, dass Ihr Gebietsschema verwendet UTF-8. Um mit UTF-8 zu arbeiten, sollten Sie die Bibliothek ncursesw kompilieren und verknüpfen.
Ferner ist die getch
Funktion nur Werte für Single-Byte-Codierungen wie ISO-8859-1, die einige Leute mit Windows cp1252 verwirren und von dort nach „Erweiterte ASCII“ (das sagt etwas über zwei Täuschungen Auslöschung nicht). UTF-8 ist eine Multibyte-Codierung. Wenn Sie getch
verwenden, um das zu lesen, erhalten Sie das erste Byte des Zeichens.
Stattdessen UTF-8, sollten Sie get_wch
verwenden lesen (es sei denn, Sie die UTF-8 selbst entschlüsseln wollen). Hier ist ein überarbeitetes Programm, das das tut:
#include <ncurses.h>
#include <locale.h>
#include <wchar.h>
int
main(void)
{
wint_t value;
setlocale(LC_ALL, "");
initscr();
get_wch(&value);
mvprintw(0, 0, "letter: %#x.", value);
refresh();
getch();
endwin();
return 0;
}
ich das Ergebnis als Zahl gedruckt, weil printw
nicht über Unicode-Werte nicht kennt. printw
verwendet die gleiche C-Laufzeitunterstützung wie printf
, daher können Sie den Wert möglicherweise direkt drucken. Zum Beispiel, ich sehe, dass POSIX printf
eine Formatierungsoption hat wint_t
für den Umgang:
c
Das int
Argument gilt ein unsigned char
umgewandelt werden und das resultierende Byte soll geschrieben werden.
Wenn ein l
(ell) Qualifier vorhanden ist, das wint_t
Argument gilt als überführt werden, wenn durch eine ls
Umwandlungsspezifikation ohne Präzision und ein Argument, das wchar_t
auf eine Zweielement-Array vom Typ weist, Das erste Element enthält das wint_t
-Argument für die Umsetzungsspezifikation ls
, und das zweite Element enthält ein Null-Wide-Zeichen.
Seit ncurses arbeitet auf vielen Plattformen, die nicht alle von denen tatsächlich Unterstützung die Funktion. Aber Sie können wahrscheinlich davon ausgehen, dass es mit der GNU C-Bibliothek funktioniert: Die meisten Distributionen bieten routinemäßig funktionsfähige Gebietsschema-Konfigurationen.
, das zu tun, ist das Beispiel interessanter:
#include <ncurses.h>
#include <locale.h>
#include <wchar.h>
int
main(void)
{
wint_t value;
setlocale(LC_ALL, "");
initscr();
get_wch(&value);
mvprintw(0, 0, "letter: %#x (%lc).", value, value);
refresh();
getch();
endwin();
return 0;
}
Es gibt keinen Standard "Erweitert ASCII". Nur ein paar verschiedene Codierungen. Es ist nicht klar, welches Ihr Terminal verwendet, möglicherweise UTF-8, das ein Code mit variabler Länge ist. Daher müssen Sie mehrere Zeichen lesen, um ein Zeichen zu erstellen. Sie sollten überprüfen und überprüfen, ob Ncurses Funktionen zur Verfügung stellt, um dies zu handhaben, z. mit breiten 'Char's. – Olaf
Ich weiß nicht, über Ncurses, aber die Windows 'conio.h' -Funktion' getch() 'gibt 2 Werte bei aufeinanderfolgenden Aufrufen zurück, wenn einige Tasten, wie die Funktionstasten gedrückt werden. Schreiben Sie ein einfaches Programm, um das (numerische) Ergebnis aufeinanderfolgender Tastendrücke anzuzeigen. –