2016-04-06 11 views
1

Ich habe ein Problem beim Lesen erweiterte ASCII-Zeichen in NCURSES.Kann nicht aus stdin erweiterte ASCII-Zeichen in NCURSES lesen

Ich habe dieses Programm:

#include <ncurses.h> 
int main() { 
    initscr(); 
    int d = getch(); 
    mvprintw(0, 0, "letter: %c.", d); 
    refresh(); 
    getch(); 
    endwin(); 
    return 0; 
} 

Ich baue es mit: gcc -lncursesw ac

Wenn ich ein Zeichen in den 7-Bit-ascii, wie das 'e' char eingeben, erhalte ich:

letter: e. 

Und dann muss ich einen anderen eingeben, damit das Programm endet.

Wenn ich ein Zeichen im erweiterten ASCII-Typ, wie das Zeichen ‚a‘, die ich erhalten:

letter: . 

und das Programm endet.

Es ist wie das zweite Byte als ein anderes Zeichen gelesen.

Wie bekomme ich die richtige char 'á' ???

Danke!

+1

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

+0

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. –

Antwort

1

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; 
} 
+0

Ich bin gegen ncursesw verlinken .. Ich habe setlocale (LC_ALL, ""); vor initcr(), aber jetzt bekomme ich .. "etter: M-!", ohne die quotes .. –

+0

Ich habe es in einem anderen Computer funktioniert, genau wie du es gezeigt hast !! Gibt es eine "mvwprintw" ähnliche Funktion, aber für Wide Chars ??? –