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.

Funzione

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

È stato utile?

Soluzione

Da curses/__init__.py:

  

Alcune costanti, in particolare il ACS_*   quelli, vengono aggiunti al C   dizionario del modulo _curses dopo initscr() si chiama. (Alcune versioni   di maledizioni di SGI non definire i valori   per queste costanti fino initscr()   è stato chiamato.) Questo wrapper   funzione chiama la C sottostante   initscr(), e quindi copia il   costanti dal   Modulo _curses al dizionario il pacchetto di maledizioni. Non fare 'from curses import *' se ti servirà il   costanti ACS_*.

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: あ

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top