Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 19, 2013 23:07:06

Rumit
Зарегистрирован: 2013-09-16
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

decode('utf-8') теряет половину строки кирилиццы

Приложение-клиент С# отправяет строку на Python эхо-сервер, с латинскими буквами и цифрами все хорошо, но когда отправляю русский текст теряется вторая половина строки:
Python 3.3.2, при отправки строки Риколв

# coding: utf-8
import socket
TCP_IP = '127.0.0.1'
TCP_PORT = 5100
BUFFER_SIZE = 10240  # Normally 1024, but we want fast response
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(2)
conn, addr = s.accept()
print ('Connection address:', addr)
while 1:
    data = conn.recv(BUFFER_SIZE)
    print(data)
    dataUtf = data.decode('utf-8')
    print(dataUtf)
    if not data: break
    print ("received data:", dataUtf)
    sendText = "Echo Text: " + dataUtf
    conn.send((sendText).encode('utf-8')) # echo
conn.close()
Консоль сервера отображает:
Connection address: ('127.0.0.1', 53868)
b'\xd0\xa0\xd0\xb8\xd0\xba'
Рик
received data: Рик
C# отправляет и принимает битовые строки в utf8

Отредактировано Rumit (Сен. 19, 2013 23:07:46)

Офлайн

#2 Сен. 20, 2013 09:02:12

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

decode('utf-8') теряет половину строки кирилиццы

Rumit
decode('utf-8') теряет половину строки кирилиццы
Результат программы показывает, что decode ничего не теряет.

Скрипт вроде как корректный.
Наверно проблема в программе на C#, в теории там отправляются байты при том что кол-во байт взято как кол-во символов в строке, т.е. вместо 12 байт отправляется 6.

Офлайн

#3 Сен. 20, 2013 09:04:44

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

decode('utf-8') теряет половину строки кирилиццы

o7412369815963
Результат программы показывает, что decode ничего не теряет.
Забыл разъяснить, русские символы в utf8 занимают по 2 байта, т.е. b'\xd0\xa0\xd0\xb8\xd0\xba' - это 3 символа, а не 6.

Офлайн

#4 Сен. 20, 2013 09:55:36

Rumit
Зарегистрирован: 2013-09-16
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

decode('utf-8') теряет половину строки кирилиццы

Спасибо большое, помог, оказывается я отправлял длину буфера по кол-ву символов в строке, а раз латинская буква = 1 бит, а кириллица = 2 битам, то и приходило пол сообщения

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version