You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 08:35:05