2011-01-16 2 views
10

Sto tentando di aggiungere wchar_t caratteri Unicode a un ncurses visualizzare in C.L'aggiunta di caratteri Unicode/UTF8 a un ncurses visualizzare in C

Ho un array:

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

E più tardi provo per aggiungere un wchar_t dalla matrice alle ncurses visualizzare con:

add_wch(characters[0]); 

per fornire un po 'più di informazioni, facendo questo con ASCII funziona bene, utilizzando:

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

// and later... 

addch(characters[0]); 

Per configurare le impostazioni internazionali, aggiungo l'inclusione ...

#include <locale.h> 

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

I ncurses comprendono è:

#include <ncurses.h> 

compilazione con:

(edit: aggiunto di serie C99, per il supporto universale del nome char)

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

ottengo il seguente avvertimento compilation (ovviamente l'eseguibile fallirà):

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

Ho provato solo usando addch che sembra essere macro'ed a lavorare con wchar_t ma quando faccio che i caratteri Unicode non mostrare, invece mostrano come caratteri ASCII.

Qualche idea?

Sto usando OS X Snow Leopard, 10.6.6

Edit: Errore rimosso su wchar_t [] assegnazione da utilizzare al posto di L'\u0E30'L"\u0E30" ecc Ho anche aggiornato le impostazioni del compilatore di utilizzare C99 (per aggiungere universale supporto nome char). entrambe le modifiche non risolvono il problema.

Ancora nessuna risposta a questo, qualcuno sa come fare Unicode ncurses addchar (add_wchar?)?! Aiuto!

+0

Si noti inoltre che non si deve mai passare alcuna stringa ma "" "' a 'setlocale'. Passando '" "' si ottiene la localizzazione configurata/di sistema, che dovrebbe essere UTF-8 basata su qualsiasi sistema moderno. Nomi come "C-UTF-8" non sono portatili. –

risposta

17

Il supporto per caratteri estesi è gestito da ncursesw. A seconda della tua distribuzione, ncurses può o meno puntare lì (apparentemente non nel tuo).

Provare a utilizzare -lncursesw anziché -lncurses.

Inoltre, per la versione locale, prova a chiamare setlocale(LC_ALL, "")

+9

Inoltre, si noti che la chiamata a 'setlocale' deve precedere' initscr() '. – g33kz0r

2

Questo è non 2 caratteri:

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

Si sta cercando di inizializzare wchar_t valori (intero) con i puntatori, che dovrebbe tradursi in un errore del compilatore.O uso:

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

o

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

Grazie per il suggerimento, ma questo non risolve il problema, vedi le mie modifiche sopra. Qualche idea? – ocodo

+0

@ R ... c'è qualche possibilità di avere una risposta a questo? – ocodo

1

cchar_t è definito come:

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

così si potrebbe provare:

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

affatto testato, ma dovrebbe funzionare .

+0

Farò un tentativo, spero che tu indovini bene;) – ocodo

+0

Beh, questo non ha funzionato, CCHARW_MAX è indefinito, non ho davvero idea di come ti sia venuto in mente, qualche spiegazione sarebbe stata utile. Ho anche dovuto aggiungere la struttura 'cchar_t' all'origine, il modo in cui l'hai inserita, ha dedotto che era già stata definita (presumibilmente in ncurses). – ocodo

+0

Aspetta, * hai * add_wch? La mia documentazione ce l'ha, ma a quanto pare non è definita nel mio ncurses.h. –

1

Hai definiscono _XOPEN_SOURCE_EXTENDED prima di includere le ncurses intestazione?

+0

Ho finito per farlo in Lisp invece che in C. :) – ocodo