我想用ncurses/python做一个小程序,并且能够使用/输入法语和日语。我知道我应该设置语言环境并使用 unicode 标准。
但是如何处理来自 screen.getch() 的结果?我想在 ncurses 窗口中显示键入的字符,而不考虑语言。
我知道一些 unicode 转换是必要的,但找不到该怎么做(我已经搜索了很多:这种字符转换业务对于业余爱好者来说并不容易理解)。
附加问题:似乎对于非 ascii 字符,我们必须使用 addstr() 而不是 addch()。同样,我应该使用 getstr() 而不是 getch() 吗?
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import curses
from curses import wrapper
import locale
locale.setlocale(locale.LC_ALL, '')
def main(scr):
# Following lines are some sort of "proof of concept"
# Indeed it print latin or japanese characters allright
scr.addstr(0, 0, u'u3042'.encode('utf-8')) # print あ
scr.addstr(1, 0, 'é'.encode('utf-8')) # print é
# But here I would like to type in a character and have it displayed onscreen
while (True):
car = scr.getch()
if car == 27: # = Escape key
break
else:
# What should I put between those parenthesis to
# print the typed character on the third line of the screen
scr.addstr(3, 0, ???? )
wrapper(main)
unctrl
是用于getch
结果的函数:
curses.unctrl(
)
返回一个字符串,该字符串是字符 ch 的可打印表示形式。控制字符显示为插入符号后跟字符,例如显示为
^C
。打印字符保持原样。
如果你想直接读取 UTF-8,请使用get_wch
(在 python2 包装器中不可用):
窗。get_wch([y, x])
获得广泛的字符。为大多数键返回一个字符,或为功能键、键盘键和其他特殊键返回一个整数。在无延迟模式下,如果没有输入,则引发异常。
版本3.3中的新功能。
即使这样,您仍然必须确保已初始化区域设置。 Python 文档假定您有权访问 ncurses 文档:
- 初始化,在 ncurses 手册页中
- get_wch、wget_wch、mvget_wch、mvwget_wch、unget_wch获取(或推送) 返回)来自诅咒终端键盘的宽字符
getch/getkey在Python中被破坏了。它们应该在按照文档设置编码时返回一个字符,但每次调用函数时,它们都会从 UTF-8 序列中一个接一个地返回八位字节。您需要通过在循环中收集八位字节来解决缺陷,直到获得完整的序列。当序列可以成功解码时,它就完成了,否则不完整。
与以下运行良好的程序进行比较(使用perl -C so-56373360.pl
运行):
use Term::ReadKey qw(ReadKey ReadMode);
ReadMode 'raw';
while () {
my $c = ReadKey 0;
last if $c eq "e"; # Escape
print $c;
}
ReadMode 'restore';