2017-12-31 7 views
0

나는 문자 그대로 다음 문자열로 변환 할 수 있습니다 방법 :문자열 리터럴 VT100 표현은 유니 코드로

token = "\x1b(0l\x1b(BHeader" 

속으로 :

"┌Header" 

나는 도서관에서 문자 유닉스 상자 그리기 문자를 수신 변환해야하고를 단위 테스트를위한 유니 코드

+0

나는 "문자 유닉스 상자 그리기 문자"들어 본 적이없는. 이것이 무엇인지에 대한 참고 자료가 있습니까? 표시 한 문자열에서 ESC 제어 문자 ('U + 1B')와 몇 가지 일반적인 ASCII 문자 ('(','0','1' 및'B')를 봅니다. – lenz

답변

6

이것은 VT-100 대체 문자 집합입니다 (질문 항목을 편집하기 전에 덜 명확한 부분). 시퀀스 esc (0은 인코딩을 대체 세트로 변경하고 시퀀스 esc (B은이를 다시 변경합니다. 이러한 문자 중 일부만 매핑됩니다. 다음은 매핑입니다.

0 1 2 3 4 5 6 7 8 9 A B C D E F 
6           ┘ ┐ ┌ └ ┼ 
7  ─   ├ ┤ ┴ ┬ │       

변환을 수행하려면 이러한 코드를 해당 유니 코드 코드 포인트에 매핑하고 직접 변환해야하는 dict을 설정해야합니다.

1

@BoarGules가 정확했습니다. 다음과 같은 문자열을 디코딩 내 솔루션입니다 :

vt_100_mapping = { 
    '0x71': '─', 
    '0x74': '├', 
    '0x75': '┤', 
    '0x76': '┴', 
    '0x77': '┬', 
    '0x78': '│', 
    '0x6a': '┘', 
    '0x6b': '┐', 
    '0x6c': '┌', 
    '0x6d': '└', 
    '0x6e': '┼', 
} 

from itertools import groupby 

def decode_vt_100(iterable, default_set='(B', alt_set='(0'): 
    for is_escape, group in groupby(iterable, lambda _: _ =='\x1b'): 
     if is_escape: 
      continue 

     characters = ''.join(group) 

     if characters.startswith(default_set): 
      yield characters[len(default_set):] 

     elif characters.startswith(alt_set): 
      for character in characters[len(alt_set):]: 
       yield vt_100_mapping[hex(ord(character))] 

>>> print(''.join(decode_vt_100("\x1b(0l\x1b(BHeader"))) 
┌Header