Telnet所用文件格式及客户端文本格式异常问题咨询
解决Telnet客户端接收数据显示异常的问题
嘿,这个问题我太熟了!你看到的那些[2J、[2;1H、[1;30;47m之类的内容,其实是ANSI终端控制序列——服务器在给终端发送控制指令(比如清屏、移动光标、设置文本/背景颜色),但你的Telnet客户端现在只是把这些原始的控制字符直接输出了,没有解析执行它们,所以才会显示成这种“乱码”效果。
两种解决方案,按需选择
1. 解析ANSI序列,保留终端格式
如果你想让客户端正确显示服务器返回的菜单样式(颜色、布局),就需要解析这些ANSI控制序列。你可以自己实现一个简单的解析器,或者直接用现成的库来帮你处理:
- 比如Python里可以用
colorama库,它能帮你在Windows、Linux、Mac上都正确解析ANSI序列,示例代码如下:import colorama from telnetlib import Telnet # 初始化colorama,确保跨终端兼容 colorama.init(autoreset=True) # 连接Telnet服务器 with Telnet("你的服务器IP", 23) as tn: while True: # 读取服务器返回的数据 data = tn.read_until(b"\n", timeout=5) if not data: break # 解码并打印,colorama会自动处理ANSI序列 print(data.decode("utf-8"), end="") - 其他语言也有对应工具,比如Java的
Jansi,C#的AnsiConsole等,原理都是一样的:识别并执行这些终端控制指令,而不是直接输出原始字符。
2. 移除ANSI序列,提取纯文本
如果你不需要保留终端的格式,只想拿到干净的菜单文字,可以用正则表达式把所有ANSI控制序列过滤掉:
- 正则表达式可以用:
\x1B\[[0-9;]*[A-Za-z],专门匹配ANSI转义序列 - Python示例代码:
处理后你示例里的内容就会变成清晰的纯文本:import re from telnetlib import Telnet # 编译正则表达式,提升匹配效率 ansi_escape_pattern = re.compile(r'\x1B\[[0-9;]*[A-Za-z]') with Telnet("你的服务器IP", 23) as tn: while True: data = tn.read_until(b"\n", timeout=5) if not data: break # 解码为字符串 raw_text = data.decode("utf-8") # 移除所有ANSI控制序列 clean_text = ansi_escape_pattern.sub('', raw_text) print(clean_text, end="")Main menu
1 Stock Booking
2 Despatch
3 Production Issues
4 Production Returns
5 Void batch
6 Area Transfer
7 Unit Issue
8 Order Labe...
额外小提示
别忘了在Telnet协商时设置合适的终端类型(比如TERM=vt100),有些服务器会根据你声明的终端类型发送不同的控制序列,设置正确的终端类型能减少兼容性问题。另外也要确认你用了正确的字符编码(比如UTF-8或ASCII)来解码接收到的字节数据,避免出现额外的乱码。
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

