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.

War es hilfreich?

Lösung

Von curses/__init__.py:

  

Einige Konstanten, vor allem die ACS_*   diejenigen, werden nur in dem C hinzugefügt   _curses Moduls Wörterbuch nach initscr() aufgerufen. (Einige Versionen   von SGIs Flüche keine Werte definieren   für diese Konstanten bis initscr()   Dieser Wrapper genannt wurde.)   Funktion ruft den zugrunde liegenden C   initscr() 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 werden   ACS_* 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: あ

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top