telnetlib3无法使用UTF-8编码问题求助
解决telnetlib3中UTF-8字符编码导致的UnicodeEncodeError问题
解决方案
方法1:直接写入编码后的字节流
绕过telnetlib3的内置编码逻辑,手动将字符串编码为UTF-8字节后,使用write_bytes方法写入:
import asyncio import telnetlib3 async def shell(reader, writer): # 直接写入UTF-8编码的字节 writer.write_bytes('ดีคับ\n'.encode('utf-8')) writer.write_bytes('Type "exit" to close the connection.\n'.encode('utf-8')) while True: writer.write_bytes('> '.encode('utf-8')) inp = await reader.read(1024) if not inp: break inp = inp.strip() if inp.lower() == 'exit': break # 格式化字符串后编码为字节写入 writer.write_bytes(f'You said: {inp}\n'.encode('utf-8')) writer.write_bytes('Goodbye!\n'.encode('utf-8')) writer.close() if __name__ == "__main__": loop = asyncio.get_event_loop() server = telnetlib3.create_server(port=8023, shell=shell, host='0.0.0.0') loop.run_until_complete(server) loop.run_forever()
方法2:使用set_encoding方法正确设置编码
替换直接赋值writer.encoding的方式,调用官方提供的set_encoding方法来设置UTF-8编码:
import asyncio import telnetlib3 async def shell(reader, writer): # 使用set_encoding方法设置编码,而非直接赋值属性 writer.set_encoding('utf-8') writer.write('ดีคับ\n') writer.write('Type "exit" to close the connection.\n') while True: writer.write('> ') inp = await reader.read(1024) if not inp: break inp = inp.strip() if inp.lower() == 'exit': break writer.write(f'You said: {inp}\n') writer.write('Goodbye!\n') writer.close() if __name__ == "__main__": loop = asyncio.get_event_loop() server = telnetlib3.create_server(port=8023, shell=shell, host='0.0.0.0', encoding='utf-8') loop.run_until_complete(server) loop.run_forever()
额外建议:升级telnetlib3版本
确保你使用的是最新版telnetlib3,旧版本可能存在编码参数传递的bug:
pip install --upgrade telnetlib3
问题原因分析
从报错信息可以看到,telnetlib3的StreamWriter.encode方法仍在使用ASCII编码处理字符串。这是因为:
- 直接赋值
writer.encoding属性可能无法触发内部状态更新,导致编码设置未生效; - 部分旧版本telnetlib3中,
create_server的encoding参数未能正确传递给StreamWriter实例; write方法依赖内置的编码逻辑,若编码未正确设置,会默认回退到ASCII。
使用write_bytes可以完全绕开内置编码逻辑,而set_encoding是官方提供的标准方法,能确保编码设置被正确应用。
内容的提问来源于stack exchange,提问作者Prinn Rinn
相关产品推荐
相关产品推荐

