I was trying to implement telnet server with telnetlib3 in python. But everything works fine until i start using some UTF-8 encoding character, that moment it’s break.
Here is my simple mock server to test about this problem
import asyncio
import telnetlib3
async def shell(reader, writer):
writer.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()
I have try to specify encoding in server = telnetlib3.create_server(port=8023, shell=shell, host='0.0.0.0', encoding='utf-8')
, of course i try both “utf-8” and “utf8”. But the telnetlib3 still uses ascii encoder to encode the string.
Here is the error (after i explicitly define a encoder utf-8)
Task exception was never retrieved
future: <Task finished name='Task-4' coro=<shell() done, defined at /home/rinz/dev/catnet/c2/whytelnet3issostupid.py:4> exception=UnicodeEncodeError('ascii', 'ดีคับn', 0, 5, 'ordinal not in range(128)')>
Traceback (most recent call last):
File "/home/rinz/dev/catnet/c2/whytelnet3issostupid.py", line 6, in shell
writer.write('ดีคับn')
File "/home/rinz/dev/catnet/.venv/lib/python3.12/site-packages/telnetlib3/stream_writer.py", line 2614, in write
self._write(self.encode(string, errors))
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/rinz/dev/catnet/.venv/lib/python3.12/site-packages/telnetlib3/stream_writer.py", line 2594, in encode
return bytes(string, encoding, errors or self.encoding_errors)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)