Найти - Пользователи
Полная версия: как сформировать utf-8 сообщение если оно приходт по частям
Начало » Python для экспертов » как сформировать utf-8 сообщение если оно приходт по частям
1
o7412369815963
у меня по сокету прилетает длинное сообщение в utf-8 (русский язык), но иногда вылетает “###result in error code page”, я думаю из-за того что иногда приходящий пакет режет двух-байтный симовол по полам, из за этого питон не может сформировать входящее сообщение ы утф8.
            while 1:
buf = s.recv(16384)

if not len(buf):
break

try:
print unicode(buf,'utf-8'),
except:
print '###result in error code page'
как быть? нужно выдавать сообщение после каждого приема.

я попробовал сделать так, если последний символ в буфере > 127 (т.е. начался 2=х байтный символ ), то перекинуть этот символ в начало следующего пришедшего сообщения, но этот вариант не работает
            z = ''
while 1:
buf = s.recv(16384)

if not len(buf):
break

if z:
buf = z + buf
z = ''
if buf[-1] > 127:
z = buf[-1]
buf = buf[:-1]

try:
print unicode(buf,'utf-8'),
except:
print '###result in error code page'
poltergeist
Может задействовать хоть какой-то протокол обмена данными? Или свой придумать на крайняк. Иначе тут не разберёшь где одно сообщение заканчивается и где второе начинается.
slav0nic
http://cr.yp.to/proto/netstrings.txt
o7412369815963
poltergeist
Может задействовать хоть какой-то протокол обмена данными? Или свой придумать на крайняк. Иначе тут не разберёшь где одно сообщение заканчивается и где второе начинается.
передается единственное сообщение, только по кускам, но на удаленной машине оно формируется постепенно.

вообщем выкрутился так: если питон выдал ексепшен - не смог преобразовать в утф8, то я жду следующий пакет и добавляю к нему текущий и по новой преобразовываю …
o7412369815963
а вообще можно попробовать сделать как в первом посте, только при получении пакета разбивать его на байты, и собирать перед преобразованием в утф8, перекинув последний байт если он - начало 2-х байтного символа
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB