2011-01-16 5 views
10

I Wchar_t Unicode-Zeichen zu einem ncurses in C. AnzeigeUnicode/UTF8 Zeichen auf einen ncurses Hinzufügen von Anzeigen in C

Ich habe ein Array hinzuzufügen bin versucht:

wchar_t characters[]={L'\uE030', L'\uE029'}; // containing 2 thai letters, for example 

Und ich später versuchen einen wchar_t aus dem Array hinzufügen, um die ncurses mit angezeigt werden: mit ASCII funktioniert ok

add_wch(characters[0]); 

um ein bisschen mehr Informationen, dies zu tun, mit:

char characters[]={'A', 'B'}; 

// and later... 

addch(characters[0]); 

die locale Zur Einrichtung, füge ich die folgenden ...

#include <locale.h> 

// in main() 
setlocale(LC_CTYPE,"C-UTF-8"); 

Die ncurses enthalten ist:

#include <ncurses.h> 

Kompilieren mit:

(edit: hinzugefügt C99-Standard, für universellen Char Namen Unterstützung.)

gcc -o ncursesutf8 ncursesutf8.c -lm -lncurses -Wall -std=c99 

erhalte ich die folgende Zusammenstellung Warnung (natürlich die ausführbare Datei wird fehlschlagen):

ncursesutf8.c:48: warning: implicit declaration of function ‘add_wch’ 

Ich habe gerade versucht addch mit der macro'ed zu sein scheint mit wchar_t zu arbeiten, aber wenn ich das tun die Unicode-Zeichen nicht angezeigt, stattdessen werden sie stattdessen als ASCII-Zeichen angezeigt.

Irgendwelche Gedanken?

I OS X Snow Leopard verwenden, 10.6.6

Edit: entfernt Fehler auf wchar_t [] Zuordnung L'\u0E30' zu verwenden, anstatt L"\u0E30" usw. ich auch die Compiler-Einstellungen aktualisiert habe C99 zu verwenden (hinzuzufügen universal Char Namen Unterstützung). Beide Änderungen beheben das Problem nicht.

Noch keine Antworten auf diese, weiß jemand, wie Unicode Ncurses addchar (add_wchar?) Zu tun?! Hilfe!

+0

Beachten Sie auch, dass Sie niemals eine Zeichenfolge außer '' '' an 'setlocale' übergeben sollten. Das Übergeben von "" "führt dazu, dass das konfigurierte/System-Gebietsschema abgerufen wird, das auf einem modernen System UTF-8 basieren sollte. Namen wie "C-UTF-8" sind nicht tragbar. –

Antwort

17

Die breite Zeichenunterstützung wird von ncursesw behandelt. Abhängig von Ihrer Distribution kann ncurses auf Sie zeigen oder nicht (scheinbar nicht in Ihrem).

Verwenden Sie -lncursesw statt -lncurses.

Auch für das Gebietsschema, versuchen setlocale(LC_ALL, "")

+9

Beachten Sie auch, dass der Aufruf von 'setlocale' vor 'initscr()' stehen muss. – g33kz0r

2

Dies ist nicht 2 Zeichen:

wchar_t characters[]={L"\uE030", L"\uE029"}; 

Sie versuchen wchar_t (integer) Werte mit Zeiger zu initialisieren, die in einem Fehler vom Compiler führen sollte.Entweder Verwendung:

wchar_t characters[]={L'\uE030', L'\uE029'}; 

oder

wchar_t characters[]=L"\uE030\uE029"; 
+0

Danke für den Tipp, aber das löst das Problem nicht, siehe meine Änderungen oben. Irgendwelche Ideen? – ocodo

+0

@R ... Hast du eine Antwort darauf? – ocodo

1

cchar_t ist definiert als:

typedef struct { 
    attr_t attr; 
    wchar_t chars[CCHARW_MAX]; 
} cchar_t; 

so können Sie versuchen:

int add_wchar(int c) 
{ 
    cchar_t t = { 
     0, // .attr 
     {c, 0} // not sure how .chars works, so best guess 
    }; 
    return add_wch(t); 
} 

nicht getestet, aber sollte funktionieren .

+0

Ich werde es versuchen, hoffe, Sie raten gut;) – ocodo

+0

Nun, das hat nicht funktioniert, CCHARW_MAX ist undefined, ich habe wirklich keine Ahnung, wie Sie mit diesem kam, wäre eine Erklärung hilfreich. Ich musste auch die 'cchar_t'-Struktur zur Quelle hinzufügen, so wie du es ausdrückst, dass sie bereits definiert war (vermutlich in ncurses). – ocodo

+0

Warte, hast du * add_wch? Meine Dokumentation hat es, aber es ist anscheinend nicht in meinem ncurses.h definiert. –

1

Aufruf Haben Sie _XOPEN_SOURCE_EXTENDED definieren, bevor die ncurses einschließlich Header?

+0

Ich habe dies in Lisp anstelle von C. getan :) – ocodo