Отправка UTF-8 с розетками - PullRequest
1 голос
/ 17 марта 2012

Я пытаюсь настроить небольшую программу чата на python. Все работало нормально, пока я послал строку, содержащую не ascii символ, который вызвал сбой программы. Строка читается из wx.TestCtrl

  • Как я могу отправить строку с кодировкой UTF-8 через сокеты?

  • Почему программа работает без проблем при запуске? Я установил кодировку UTF-8 так не все ли символы приводят к сбою программы?

Вот ошибка:

Traceback (most recent call last):
  File "./client.py", line 180, in sendMess
    outSock.sendto(s,self.serveraddr)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 26: 
                    ordinal not in range(128)

Вот как я создаю сокет и пытаюсь отправить сообщение:

  outSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  ....
  outSock.sendto(s,self.serveraddr)

1 Ответ

8 голосов
/ 17 марта 2012

В Python 2 socket.sendto в сокете принимает "простую" строку, а не unicode объект. Поэтому вы должны закодировать его, скажем, используя UTF-8:

outSock.sendto(s.encode('utf-8'), self.serveraddr)

Точно так же, когда вы recvfrom (или похожий) на другом конце, вам нужно преобразовать обратно в объект Unicode:

unicode_string = s.decode('utf-8')

(В Python 3 вы будете работать с bytes, что делает необходимость преобразования между ним и unicode более явной.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...