Python 's Curses 라이브러리에서 확장 문자를 어떻게 사용합니까?

StackOverflow https://stackoverflow.com/questions/1279341

  •  16-09-2019
  •  | 
  •  

문제

나는 파이썬에서 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()

출력 : あ

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top