Python 用telnetlib解码老式BBS ANSI的问题

Python 用telnetlib解码老式BBS ANSI的问题,python,ascii,non-ascii-characters,telnetlib,Python,Ascii,Non Ascii Characters,Telnetlib,他试图用telnetlib帮助我在一个老式的BBS上玩贸易战 我记得(这是30多年前)BBS使用了某种扩展的ASCII和/或ANSI。用于彩色文本和一些简单的图形,如边、角等 通用telnet终端,如gnu telnet,无法正确呈现这些站点。 SyncTerm(古代软件)在我的mac电脑上运行,并正确显示文本和图形。 我的问题是telnetlib.read_until()返回我无法解码为可读内容的字节 我的登录读/写片段: print (tt.read_until("Show today's

他试图用telnetlib帮助我在一个老式的BBS上玩贸易战

我记得(这是30多年前)BBS使用了某种扩展的ASCII和/或ANSI。用于彩色文本和一些简单的图形,如边、角等

通用telnet终端,如
gnu telnet
,无法正确呈现这些站点。 SyncTerm(古代软件)在我的mac电脑上运行,并正确显示文本和图形。

我的问题是
telnetlib.read_until()
返回我无法解码为可读内容的
字节

我的登录读/写片段:

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'))
读取直到()
给我
字节

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]'
这不起作用,因为出现了一些非utf-8代码:
UnicodeDecodeError:'utf-8'编解码器无法解码位置265处的字节0xde:无效的连续字节

如果我解码为
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              ', '  úúúúúúú', '.ßÜ°°°°±°°±±°  ²±°±°°±°   °    °    °±±°±±°±', '

这里有两个独立的问题。一个是让Python处理ANSI x3.64显示代码,另一个是模拟远程系统硬编码要使用的遗留8位字符集。第二种盲目地假设您的输入在代码页850中,但它至少应该让您知道如何解决映射问题(如果850错误,可以尝试cp437)。还可以查看您是否猜不到正确的编码。您知道或可以猜出它们代表的字符的几个字节通常足以识别一个或两个好的候选字符集。@tripleee cp850是一个改进,cp437将字符转换得最好。谢谢。这里有两个不同的问题。一个是让Python处理ANSI x3.64显示代码,另一个是模拟远程系统硬编码要使用的遗留8位字符集。第二种盲目地假设您的输入在代码页850中,但它至少应该让您知道如何解决映射问题(如果850错误,可以尝试cp437)。还可以查看您是否猜不到正确的编码。您知道或可以猜出它们代表的字符的几个字节通常足以识别一个或两个好的候选字符集。@tripleee cp850是一个改进,cp437将字符转换得最好。谢谢
['ú.   Üßßß Ûßßß  ßÛß        ÍÞÍÞðÞÍÞÍÞÍÞðÞ', 'ÞÍÞ  ..ÜßßÜÛÜ      ßÛÛÛÜÜ   ÛÛÛÍÞÍÞÍÞúÞÍÍÍÞÍÞ', 'ÞðÞ   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              ', '  úúúúúúú', '.ßÜ°°°°±°°±±°  ²±°±°°±°   °    °    °±±°±±°±', '