python - 使用 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 ', ' úúúúúúú', '.ßÜ°°°°±°°±±° ²±°±°°±° ° ° °±±°±±°±', '
解决方案
推荐阅读
- python - 在 DataFrame 中处理数据的最佳方式
- xamarin - Xamarin.iOS 中的多个文本粗体 UITextView
- javascript - 无法在反应中将带有对象的数组作为道具传递
- python - Python散点图:软聚类
- visual-studio - Visual Studio Code Remote - 文件索引是在远程服务器上还是在我的本地机器上完成?我可以使索引更快吗?
- spring-boot - Artemis 的生产者问题
- node.js - 从 POST 请求中检索参数 React.js --> Node.js 使用 Axios
- node.js - 域名在unbuntu中的80以外的端口上不起作用
- angular - 在 angular primeng 下将值转换为标签
- firebase - Google Ads + iOS first_open 转化跟踪问题