Come faccio a usare i caratteri estesi in Python maledice biblioteca?
Domanda
Ho letto tutorial sulla programmazione Maledizioni in Python, e molti si riferiscono alla capacità di utilizzare i caratteri estesi, come ad esempio i simboli linea di disegno. Sono personaggi> 255, e la biblioteca maledizioni sa come visualizzarli nel font terminale corrente.
Alcuni dei tutorial dicono si utilizza in questo modo:
c = ACS_ULCORNER
... e alcuni dicono si utilizza in questo modo:
c = curses.ACS_ULCORNER
(che dovrebbe essere l'angolo superiore sinistro di una scatola, come una L capovolta in verticale)
In ogni caso, a prescindere da quale metodo che uso, il nome non è definito e il programma non riesce in tal modo. Ho provato "maledizioni di importazione" e "da maledizioni import *", e nessuno dei due lavori.
FunzioneFinestra Curses' () fa uso di questi personaggi, così ho anche provato rovistando sulla mia macchina per la sorgente per vedere come è lo fa, ma non riesco a trovarlo da nessuna parte.
Soluzione
Da curses/__init__.py
:
Alcune costanti, in particolare il
ACS_*
quelli, vengono aggiunti al C dizionario del modulo_curses
dopoinitscr()
si chiama. (Alcune versioni di maledizioni di SGI non definire i valori per queste costanti finoinitscr()
è stato chiamato.) Questo wrapper funzione chiama la C sottostanteinitscr()
, e quindi copia il costanti dal Modulo_curses
al dizionario il pacchetto di maledizioni. Non fare 'from curses import *
' se ti servirà il costantiACS_*
.
In altre parole:
>>> import curses
>>> curses.ACS_ULCORNER
exception
>>> curses.initscr()
>>> curses.ACS_ULCORNER
>>> 4194412
Altri suggerimenti
Credo che il seguito è opportunamente legati, per essere pubblicato in questa domanda. Qui sarò con utfinfo.pl ( vedi anche su Super User ).
Prima di tutto, per il set di caratteri ASCII standard, il punto di codice Unicode e la codifica byte è lo stesso:
$ echo 'a' | perl utfinfo.pl
Char: 'a' u: 97 [0x0061] b: 97 [0x61] n: LATIN SMALL LETTER A [Basic Latin]
Quindi possiamo fare in curses
di Python:
window.addch('a')
window.border('a')
... e funziona come previsto
Tuttavia, se un personaggio è al di sopra ASCII di base, poi ci sono differenze, che docs addch
non necessariamente fanno esplicito. In primo luogo, non posso fare:
window.addch(curses.ACS_PI)
window.border(curses.ACS_PI)
... nel qual caso, a mio gnome-terminal
, il carattere Unicode '¸' viene reso. Tuttavia, se si ispezionare ACS_PI
, vedrete che è un numero intero, con un valore pari a 4.194.427 (0x40007b); quindi il seguente sarà anche rendere lo stesso carattere 'π' (o rater, glifo?):
window.addch(0x40007b)
window.border(0x40007b)
Per vedere che cosa sta succedendo, ho grepped attraverso la sorgente ncurses
, e trovato il seguente:
#define ACS_PI NCURSES_ACS('{') /* Pi */
#define NCURSES_ACS(c) (acs_map[NCURSES_CAST(unsigned char,c)])
#define NCURSES_CAST(type,value) static_cast<type>(value)
#lib_acs.c: NCURSES_EXPORT_VAR(chtype *) _nc_acs_map(void): MyBuffer = typeCalloc(chtype, ACS_LEN);
#define typeCalloc(type,elts) (type *)calloc((elts),sizeof(type))
#./widechar/lib_wacs.c: { '{', { '*', 0x03c0 }}, /* greek pi */
Nota qui:
$ echo '{π' | perl utfinfo.pl
Got 2 uchars
Char: '{' u: 123 [0x007B] b: 123 [0x7B] n: LEFT CURLY BRACKET [Basic Latin]
Char: 'π' u: 960 [0x03C0] b: 207,128 [0xCF,0x80] n: GREEK SMALL LETTER PI [Greek and Coptic]
... nessuno dei quali si riferisce al valore di 4194427 (0x40007b) per ACS_PI
.
Così, quando addch
e / o border
vedono un carattere sopra ASCII (fondamentalmente un unsigned int
, al contrario di unsigned char
), essi (almeno in questo esempio) utilizzare quel numero non come punto di codice Unicode , o come rappresentazione UTF-8 byte codificati - ma invece, lo usano come un indice look-up per la funzione acs_map
-ping (che alla fine, però, potrebbero restituire il punto di codice Unicode, anche se emula VT-100). È per questo che le seguenti specifiche:
window.addch('π')
window.border('π')
fallirà in Python 2.7 con argument 1 or 3 must be a ch or an int
; e in Python 3.2 renderebbe semplicemente uno spazio invece di un carattere. Quando specifichiamo 'π'
. abbiamo effettivamente specificato la codifica UTF-8 [0xCF, 0x80] - ma anche se specifichiamo il punto di codice Unicode:
window.addch(0x03C0)
window.border0x03C0)
... semplicemente rende nulla (spazio) sia in Python 2.7 e 3.2.
Detto questo - la funzione addstr
non accettano stringhe UTF-8 codificati, e funziona bene:
window.addstr('π')
... ma per le frontiere - in quanto border()
maniglie a quanto pare i personaggi allo stesso modo addch()
fa - siamo apparentemente fuori di fortuna, per tutto quanto non espressamente specificato come una costante ACS
(e non c'è che molti di loro, o) .
Spero che questo aiuti qualcuno,
Cheers!
è necessario impostare il vostro locale per tutti, quindi codificare l'output come UTF-8 come segue:
import curses
import locale
locale.setlocale(locale.LC_ALL, '') # set your locale
scr = curses.initscr()
scr.clear()
scr.addstr(0, 0, u'\u3042'.encode('utf-8'))
scr.refresh()
# here implement simple code to wait for user input to quit
scr.endwin()
uscita: あ