Pregunta

He estado leyendo tutoriales sobre programación Curses en Python, y muchos se refieren a la capacidad de utilizar caracteres extendidos, como los símbolos de línea de dibujo. Son caracteres> 255, y la biblioteca maldiciones sabe cómo mostrar en la fuente de terminal actual.

Algunos de los tutoriales dicen que lo utilice como esto:

c = ACS_ULCORNER

... y algunos dicen que lo utilice como esto:

c = curses.ACS_ULCORNER

(que se supone que es la esquina superior izquierda de una caja, como una L invertir en vertical)

En cualquier caso, independientemente del método que utilizo, el nombre no está definido y por lo tanto el programa falla. Traté de importación "maldiciones" y "maldiciones de importación *", y no funciona ninguno.

función

ventana de Curses' () hace uso de estos personajes, por lo que incluso lo intentó hurgar en mi caja de la fuente para ver cómo que lo hace, pero no puedo encontrar en cualquier lugar.

¿Fue útil?

Solución

De curses/__init__.py:

  

Algunas constantes, sobre todo la ACS_*   queridos, solamente se añaden a la C   El diccionario de módulo _curses después initscr() se llama. (Algunas versiones   de maldiciones de SGI no definen valores   para esas constantes hasta initscr()   que se ha llamado.) Este envoltorio   función llama a la C subyacente   initscr(), y se copia a las   constantes de la   _curses módulo de diccionario de la maldición del paquete. No hagas 'from curses import *' si voy a necesitar la   constantes ACS_*.

En otras palabras:

>>> import curses
>>> curses.ACS_ULCORNER
exception
>>> curses.initscr()
>>> curses.ACS_ULCORNER
>>> 4194412

Otros consejos

Creo que el siguiente es apropiada relacionada, para ser publicado bajo esta cuestión. Aquí voy a estar utilizando utfinfo.pl ( véase también en super User ).

En primer lugar, para el conjunto de caracteres ASCII estándar, el punto de código Unicode y la codificación de bytes es el mismo:

$ echo 'a' | perl utfinfo.pl 
Char: 'a' u: 97 [0x0061] b: 97 [0x61] n: LATIN SMALL LETTER A [Basic Latin]

Por lo que podemos hacer en curses de Python:

window.addch('a')
window.border('a') 

... y funciona según lo previsto

Sin embargo, si un personaje está por encima ASCII básico, entonces hay diferencias, que docs addch no necesariamente hacen explícito. En primer lugar, no puedo hacer:

window.addch(curses.ACS_PI)
window.border(curses.ACS_PI)

... en cuyo caso, en mi gnome-terminal, el carácter Unicode 'pi' se rinde. Sin embargo, si usted examina ACS_PI, verá que es un número entero, con un valor de 4.194.427 (0x40007b); por lo que el siguiente también hará que el mismo carácter 'π' (o evaluador, glifo?):

window.addch(0x40007b)
window.border(0x40007b)

Para ver lo que está pasando, me grepped través de la fuente ncurses, y encontré lo siguiente:

#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 aquí:

$ 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]

... ninguno de los cuales se relaciona con el valor de 4194427 (0x40007b) para ACS_PI.

Por lo tanto, cuando addch y / o border ver un personaje por encima de ASCII (básicamente una unsigned int, en contraposición a unsigned char), que (al menos en este caso) utiliza ese número no como punto de código Unicode , o como la representación UTF-8 bytes codificados - pero en cambio, lo utilizan como un índice de consulta para la función acs_map-ping (que en última instancia, sin embargo, le volver al punto de código Unicode, incluso si emula VT-100). Por eso, la siguiente especificación:

window.addch('π') 
window.border('π') 

fallará en Python 2.7 con argument 1 or 3 must be a ch or an int; y en Python 3.2 haría simplemente un espacio en lugar de un carácter. Cuando especificamos 'π'. en realidad nos hemos especificado la codificación UTF-8 [0xCF, 0x80] - pero incluso si especificamos el punto de código Unicode:

window.addch(0x03C0) 
window.border0x03C0) 

... simplemente hace nada (espacio) tanto en Python 2.7 y 3.2.

Una vez dicho esto - la addstr función hace aceptar cadenas UTF-8 codificado, y funciona bien:

window.addstr('π')

... pero para las fronteras - ya border() parecer maneja caracteres de la misma manera lo hace addch() - estamos aparentemente fuera de suerte, por todo lo que no se especifica explícitamente como una constante ACS (y no hay que muchos de ellos, tampoco) .

Espero que esto ayude a alguien, España Saludos!

tiene que configurar su local para todos, entonces codificar su salida como UTF-8 de la siguiente manera:

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()

salida: あ

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top