Python 's Curses 라이브러리에서 확장 문자를 어떻게 사용합니까?
문제
나는 파이썬에서 Curses 프로그래밍에 대한 튜토리얼을 읽었으며 많은 사람들이 라인 드레임 기호와 같은 확장 문자를 사용하는 능력을 언급했습니다. 그들은 255 캐릭터이고 Curses 라이브러리는 현재 터미널 글꼴에 표시하는 방법을 알고 있습니다.
튜토리얼 중 일부는 다음과 같이 사용한다고 말합니다.
c = ACS_ULCORNER
... 일부는 다음과 같이 사용한다고 말합니다.
c = curses.ACS_ULCORNER
(L이 수직으로 뒤집힌 것처럼 상자의 왼쪽 왼쪽 구석이되어야합니다)
어쨌든, 내가 사용하는 방법에 관계없이 이름은 정의되지 않아 프로그램이 실패합니다. 나는 "Curses import *에서"Curses "와"import Curses "와"import Curses "를 시도했지만 아무런 효과가 없었습니다.
Curses 'Window () 함수는이 문자를 사용하므로 소스가 어떻게 보이기 위해 내 상자에 찌르려고 시도했습니다. 그것 그렇게하지만 어디서나 찾을 수 없습니다.
해결책
에서 curses/__init__.py
:
일부 상수, 특히
ACS_*
하나는 c에만 추가됩니다_curses
모듈 사전 후initscr()
호출됩니다. (SGI의 저주의 일부 버전은 해당 상수의 값을 정의하지 않습니다.initscr()
이 래퍼 함수는 기본 C라고 부릅니다.initscr()
, 그런 다음 상수를 복사합니다_curses
Curses 패키지 사전에 대한 모듈. 하지마 'from curses import *
'당신이 필요하다면ACS_*
상수.
다시 말해:
>>> import curses
>>> curses.ACS_ULCORNER
exception
>>> curses.initscr()
>>> curses.ACS_ULCORNER
>>> 4194412
다른 팁
아래는이 질문에 따라 게시 될 적절한 관련이 있다고 생각합니다. 여기서 사용할 것입니다 utfinfo.pl (또한 참조 슈퍼 사용자).
우선, 표준 ASCII 문자 세트의 경우 유니 코드 코드 포인트와 바이트 인코딩은 동일합니다.
$ echo 'a' | perl utfinfo.pl
Char: 'a' u: 97 [0x0061] b: 97 [0x61] n: LATIN SMALL LETTER A [Basic Latin]
그래서 우리는 파이썬에서 할 수 있습니다 curses
:
window.addch('a')
window.border('a')
... 그리고 그것은 의도 한대로 작동합니다
그러나 캐릭터가 기본 ASCII 이상인 경우 차이점이 있습니다. addch
문서 반드시 명시 적으로 만들지는 않습니다. 먼저 할 수 있습니다.
window.addch(curses.ACS_PI)
window.border(curses.ACS_PI)
... 어떤 경우에는 내 gnome-terminal
, 유니 코드 문자 'π'가 렌더링됩니다. 그러나 검사하는 경우 ACS_PI
, 당신은 그것이 4194427 (0x40007b) 인 정수 번호를 볼 수 있습니다. 따라서 다음은 동일한 문자 (또는 평가자, 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]
... 그 중 어느 것도 4194427 (0x40007b)의 값과 관련이 없습니다. ACS_PI
.
따라서 언제 addch
및/또는 border
ASCII 위의 캐릭터를 참조하십시오 (기본적으로 unsigned int
, 반대로 unsigned char
), 그들은 (적어도이 경우) 그 숫자를 사용합니다. ~ 아니다 유니 코드 코드 포인트 또는 UTF-8 인코딩 바이트 표현으로서-대신에이를 조회 인덱스로 사용합니다. acs_map
-기능 (궁극적으로는 ~일 것이다 VT-100을 모방하더라도 유니 코드 코드 포인트를 반환하십시오). 그렇기 때문에 다음과 같은 사양이 있습니다.
window.addch('π')
window.border('π')
Python 2.7에서 실패합니다 argument 1 or 3 must be a ch or an int
; 그리고 Python 3.2에서는 캐릭터 대신 단순히 공간을 렌더링합니다. 우리가 지정할 때 'π'
. 실제로 UTF -8 인코딩 [0XCF, 0X80]을 지정했지만 유니 코드 코드 포인트를 지정하더라도
window.addch(0x03C0)
window.border0x03C0)
... 단순히 파이썬 2.7과 3.2에서 아무것도 (공간) 아무것도 렌더링하지 않습니다 (공간).
그것은 말한다 - 기능 addstr
하다 UTF-8 인코딩 된 문자열을 수락하고 잘 작동합니다.
window.addstr('π')
...하지만 국경을 위해 - 그 이후로 border()
분명히 같은 방식으로 캐릭터를 처리합니다 addch()
그렇게 - 우리는 분명히 운이 좋지 않습니다. ACS
일정합니다 (그리고 그 중 많은 것도 없습니다).
이것이 누군가를 도울 수 있기를 바랍니다.
건배!
로컬을 모두에게 설정 한 다음 다음과 같이 출력을 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()
출력 : あ