我一直在阅读有关Python中Curses编程的教程,许多人都提到使用扩展字符的能力,例如线条图符号。他们是角色> 255,curses库知道如何以当前终端字体显示它们。
有些教程说你像这样使用它:
c = ACS_ULCORNER
......有人说你这样用它:
c = curses.ACS_ULCORNER
(那应该是一个盒子的左上角,就像L垂直翻转一样)
无论如何,无论我使用哪种方法,都没有定义名称,因此程序失败了。我试过“import curses”和“from curses import *”,但都不起作用。
Curses的window()函数使用了这些字符,所以我甚至尝试在我的盒子上寻找源代码来查看 it 是如何做到的,但我无法在任何地方找到它。
答案 0 :(得分:4)
来自curses/__init__.py
:
一些常数,最值得注意的是
ACS_*
一些,只添加到C中 调用_curses
后的initscr()
模块字典。 (有些版本 SGI的诅咒没有定义价值观 对于那些常数,直到initscr()
被称为。)这个包装器 函数调用底层Cinitscr()
,然后复制 来自的常数_curses
模块到curses包的字典。如果您需要,请不要“from curses import *
”ACS_*
常数。
换句话说:
>>> import curses
>>> curses.ACS_ULCORNER
exception
>>> curses.initscr()
>>> curses.ACS_ULCORNER
>>> 4194412
答案 1 :(得分:4)
我认为以下内容是相关的,将在此问题下发布。在这里,我将使用utfinfo.pl(另见Super User)。
首先,对于标准ASCII字符集,Unicode代码点和字节编码是相同的:
$ echo 'a' | perl utfinfo.pl
Char: 'a' u: 97 [0x0061] b: 97 [0x61] n: LATIN SMALL LETTER A [Basic Latin]
所以我们可以用Python的curses
:
window.addch('a')
window.border('a')
......它按预期工作
但是,如果一个字符高于基本ASCII,则存在差异,addch
docs不一定明确。首先,我可以这样做:
window.addch(curses.ACS_PI)
window.border(curses.ACS_PI)
...在这种情况下,在我的gnome-terminal
中,呈现Unicode字符'π'。但是,如果你检查ACS_PI
,你会看到它是一个整数,值为4194427(0x40007b);所以下面也会渲染相同的字符(或rater,glyph?)'π':
window.addch(0x40007b)
window.border(0x40007b)
为了了解发生了什么,我浏览了ncurses
来源,发现了以下内容:
#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 */
请注意:
$ 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]
...两者都与ACS_PI
的4194427(0x40007b)的值无关。
因此,当addch
和/或border
看到ASCII以上的字符(基本上是unsigned int
而不是unsigned char
)时,它们(至少在这种情况下) )使用该数字不作为Unicode代码点,或者使用UTF-8编码的字节表示 - 但是,它们将其用作acs_map
- ping函数的查找索引(最终但是,将返回Unicode代码点,即使它模拟VT-100)。这就是以下规范的原因:
window.addch('π')
window.border('π')
在使用argument 1 or 3 must be a ch or an int
的Python 2.7中失败;并且在Python 3.2中只会渲染一个空格而不是一个字符。当我们指定'π'
时。我们实际上已经指定了UTF-8编码[0xCF,0x80] - 但即使我们指定了Unicode代码点:
window.addch(0x03C0)
window.border0x03C0)
...它只是在Python 2.7和3.2中都没有呈现任何内容(空格)。
话虽如此 - 函数addstr
接受UTF-8编码的字符串,并且工作正常:
window.addstr('π')
...但是对于边框 - 因为border()
显然以addch()
的方式处理字符 - 我们显然运气不好,因为任何未明确指定为ACS
的内容常数(也没有那么多)。
希望这有助于某人,
干杯!
答案 2 :(得分:4)
您必须将本地设置为all,然后将输出编码为utf-8,如下所示:
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()
输出: あ