首页 > 解决方案 > 使用 telnetlib 解码老式 BBS ANSI 时出现问题

问题描述

试图用来telnetlib帮助我在老式 BBS 上玩 TradeWars。

我记得(这是 30 多年前)BBS 使用了某种扩展的 ASCII 和/或称为 ANSI 的东西。专为彩色文本和一些简单的图形而设计,如边缘、角落等。

一个通用的 telnet 终端,如gnu telnet,不能正确呈现这些站点。 在此处输入图像描述 SyncTerm(古老的软件)可以在我的 Mac 上运行,并且可以正确显示文本和图形。 在此处输入图像描述

我的问题是telnetlib.read_until()返回bytes的东西我无法解码成可读的东西。

我的登录读/写片段:

print (tt.read_until("Show today's log?".encode('ascii')),3)
tt.write('\r\n'.encode('ascii'))
print (tt.read_until('[Pause]'.encode('ascii')),3)
tt.write('\r\n'.encode('ascii'))
print (tt.read_until('Password?'.encode('ascii')),3)
tt.write('NOTMYPASSWORD\r\n'.encode('ascii'))
zaa = tt.read_until('[Pause]'.encode('ascii'))
print(zaa)
tt.write('\r\n'.encode('ascii'))

read_until()正在给我bytes

print (type(zaa)) zaa.decode('utf-8')

<class 'bytes'> ' ****\r\x1b[0m\n\r\n\x1b[1;33mYou have been on today.\r\x1b[0m\n\x1b[32mSearching for messages received since your last time on\x1b[1;33m:\r\x1b[0m\n\x1b[32mNo messages received.\r\x1b[0m\n\x1b[35m[Pause]'

但我不知道如何将它们解码成更好读的东西,或者至少只是去掉所有可怕的颜色控制代码或其他任何东西。

关于如何很好地解析这个的任何建议?

谢谢

==========

这是我现在想出的。但仍然想知道是否有更好的解决方案。

def de_ansi(somebytes):
    #https://stackoverflow.com/questions/13506033/filtering-out-ansi-escape-sequences
    #https://stackoverflow.com/questions/14693701/how-can-i-remove-the-ansi-escape-sequences-from-a-string-in-python
    ansi_escape = re.compile(r'\x1B\[[0-?]*[ -/]*[@-~]')
    text =  ansi_escape.sub('', somebytes.decode('utf-8'))
    return text.splitlines()

这不起作用,因为出现了一些非 utf-8 代码: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xde in position 265: invalid continuation byte

如果我解码为Latin-1没有抛出错误,但输出很糟糕:

['ú.   Üßßß Ûßßß  ßÛß        ÍÞÍÞðÞÍÞÍÞÍÞðÞ', 'ÞÍÞ  ..ÜßßÜÛÜ      ßÛÛÛÜÜ   ÛÛÛÍÞÍÞÍÞúÞÍÍÍÞÍÞ', 'ÞðÞ   Visit : telnet://mtlgeek.synchro.netÛÛÛÛ ÜÛÜ      ßÛÛÛÜÜ ÛßÍÍðÍËÞÍÞÍËÍÞÍÞ', 'Þ͹   ÜßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜßßßÜÜÍÞÍÞÊÞÍÞ͹ðÞÍÞ', 'ÞÍÞÍÞÉÞÍðúðÍÞ»ÞðÞÍÞÉÞÍÞúÞðÍÍÍðÞÍÞðÞÍÞÍÞðÞÍÍÍÞÍÞÍÞúÞÍðÍÞÍÞÍÞÍÞðÞÍÞÍÞÍÞÍÎÍÞÍÞÍÞúATrade Wars 2002 Win32 module now loading.', '', 'Mearratwe', 'tcfho SMearra', 'twetcfho SMea', 'rratwetcfho ', 'SMartech SoftwareMartech SoftwareMartech Software', 'Martech SoftwareMartech SoftwareShocfe', 'ttwraarMeSh', 'ocfettwraarM', 'e             ', '  psrtensepsrt', 'ensepsrtensepresen', 'tspresentspresentspresentspresentspresentse', 'snetrspseenrtp', 's              ', '  úúúúúúú', '.ßÜ°°°°±°°±±°  ²±°±°°±°   °    °    °±±°±±°±', '

标签: pythonasciinon-ascii-characterstelnetlib

解决方案


推荐阅读