2017-12-31 28 views
0

Wie kann ich konvertiere die folgenden Stringliteral:Stringliteral VT100 Darstellung Unicode

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

In:

"┌Header" 

Ich empfange wörtliche Unix Box-Zeichnen von Buchstaben aus einer Bibliothek und muß konvertieren Unicode für Komponententests.

+0

Ich habe noch nie von "wörtliche Unix-Zeichnen von Buchstaben" gehört. Hast du eine Referenz für was das ist? In der Zeichenfolge, die Sie anzeigen, sehe ich das ESC-Steuerzeichen ('U + 1B') und ein paar übliche ASCII-Zeichen (' (',' 0', '1', und' B'). – lenz

Antwort

6

Dies ist der alternative Zeichensatz VT-100 (etwas, das vor der Bearbeitung des Fragethemas weniger offensichtlich war). Die Sequenz esc (0 ändert die Codierung in die alternative Menge und die Sequenz esc (B ändert sie zurück. Es gibt nur eine Handvoll solcher Charaktere. Hier ist das Mapping.

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

die Konvertierung zu tun Sie eine dict einzurichten gehst zu haben, die diese Codes in die entsprechenden Unicode-Codepoints abbildet und diese selbst zu konvertieren.

1

@BoarGules war korrekt. Hier ist meine Lösung Strings wie diese zu entschlüsseln:

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 
Verwandte Themen