Wie verwende ich erweiterte Zeichen in Python-Bibliothek Flüche?
Frage
Ich habe Tutorials über Flüche Programmierung in Python zu lesen, und viele beziehen sich auf eine Fähigkeit, erweiterte Zeichen zu verwenden, wie zum Beispiel Strichzeichnung Symbole. Sie sind Zeichen> 255, und die Flüche Bibliothek weiß, wie sie in der aktuellen Terminal Schriftart angezeigt werden soll.
Einige der Tutorials sagen Sie es wie folgt verwendet werden:
c = ACS_ULCORNER
... und manche sagen Sie es wie folgt verwendet werden:
c = curses.ACS_ULCORNER
(Das sollte die obere linke Ecke einer Box sein, wie ein L vertikal gespiegelten)
Wie auch immer, unabhängig davon, welche Methode, die ich verwende, wird der Name nicht definiert und das Programm somit versagt. Ich habe versucht, „Import Flüche“ und „von Flüche importieren *“ und weder funktioniert.
Curses' window () Funktion nutzt diese Zeichen, also versuchte ich auch um auf meine Box Stossen für die Quelle zu sehen, wie es tut es, aber ich kann es nicht überall.
Lösung
Von curses/__init__.py
:
Einige Konstanten, vor allem die
ACS_*
diejenigen, werden nur in dem C hinzugefügt_curses
Moduls Wörterbuch nachinitscr()
aufgerufen. (Einige Versionen von SGIs Flüche keine Werte definieren für diese Konstanten bisinitscr()
Dieser Wrapper genannt wurde.) Funktion ruft den zugrunde liegenden Cinitscr()
und kopiert dann die Konstanten aus der_curses
Modul in das Wörterbuch Flüche Paket. Tun Sie das nicht ‚from curses import *
‘, wenn Sie die mehr brauchen werdenACS_*
Konstanten.
Mit anderen Worten:
>>> import curses
>>> curses.ACS_ULCORNER
exception
>>> curses.initscr()
>>> curses.ACS_ULCORNER
>>> 4194412
Andere Tipps
Ich glaube, unter dem in geeigneter Weise verbunden ist, im Rahmen dieser Frage gestellt werden. Hier werde ich verwenden utfinfo.pl ( siehe auch auf super User ).
Zunächst einmal für Standard-ASCII-Zeichensatz, der Unicode-Codepunkt und die Byte-Codierung ist das gleiche:
$ echo 'a' | perl utfinfo.pl
Char: 'a' u: 97 [0x0061] b: 97 [0x61] n: LATIN SMALL LETTER A [Basic Latin]
So wir in Python curses
tun können:
window.addch('a')
window.border('a')
... und es funktioniert wie beabsichtigt
Wenn jedoch ein Zeichen über ASCII-Basis ist, dann gibt es Unterschiede, die a href <= "http://docs.python.org/2/library/curses.html#curses.window.addch" rel = "nofollow noreferrer"> addch
docs nicht unbedingt explizit machen. Erstens kann ich tun:
window.addch(curses.ACS_PI)
window.border(curses.ACS_PI)
... in diesem Fall in meinem gnome-terminal
, die Unicode-Zeichen '& pi;' gemacht wird. Wenn Sie jedoch ACS_PI
untersuchen, sehen Sie, es ist eine ganze Zahl mit einem Wert von 4194427 (0x40007b); so wird folgendes machen auch den gleichen Charakter 'π' (oder rater, Glyphe?):
window.addch(0x40007b)
window.border(0x40007b)
Um zu sehen, was vor sich geht, grep ich durch die ncurses
Quelle und fanden die folgende:
#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 */
Hinweis hier:
$ 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]
... von denen keiner bezieht sich auf den Wert von 4194427 (0x40007b) für ACS_PI
.
Wenn also addch
und / oder border
ein Zeichen über ASCII sehen (im Grunde ein unsigned int
, im Gegensatz zu unsigned char
), sie (zumindest in diesem Fall) verwendet diese Zahl nicht als Unicode-Codepunkt oder als UTF-8-codierte Darstellung Bytes - sondern, sie verwenden es als Look-up-Index für acs_map
-Ping-Funktion (die letztlich jedoch würde zurückkehren den Punkt Unicode-Code, auch wenn es emuliert VT-100). Deshalb ist die folgende Beschreibung:
window.addch('π')
window.border('π')
wird in Python 2.7 mit argument 1 or 3 must be a ch or an int
scheitern; und in Python 3.2 machen würde einfach einen Raum statt einem Zeichen. Wenn wir 'π'
angeben. wir haben die UTF-8-Kodierung tatsächlich angegeben [0xCF, 0x80] - aber selbst wenn wir den Unicode-Codepunkt angeben:
window.addch(0x03C0)
window.border0x03C0)
... es einfach macht nichts (Raum) in sowohl Python 2.7 und 3.2.
Dass gesagt wird - die Funktion addstr
hat UTF-8 kodierten Strings akzeptieren, und funktioniert gut:
window.addstr('π')
... aber für Grenzen - da border()
Griffe scheinbar Zeichen in der gleichen Art und Weise addch()
tut - wir sind offenbar kein Glück, denn alles, was nicht explizit als ACS
Konstante angegeben (und es gibt nicht so viele von ihnen, entweder) .
Hope, das hilft jemand,
Cheers!
Sie müssen Ihre lokal alle setzen, dann die Ausgabe als kodieren utf-8 wie folgt:
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()
Ausgabe: あ