[python] unicode string to bytes
От: Аноним  
Дата: 04.08.09 07:42
Оценка:
На питоне никогда не кодил, но тем не менее возникла задача переслать через сокеты юникодную строку.
Если поступить с ней как с простой строкой, то отправляется только первый байт кодирующий каждый символ:
sock.connect((HOST, PORT))
sock.send(unicode('привет мир'))

Соответственно хочется представить эту строку в виде массива байт и пропихнуть уже его, но нигде не могу найти как выполнить такое преобразование.
Использовать перекодирование юникода в ascii, к глубочайшему сожалению нельзя, так как там могут быть символы из разных codepage-й.

Заранее благодарю за дельный ответ.
python unicode string sockets
Re: [python] unicode string to bytes
От: neFormal Россия  
Дата: 04.08.09 07:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>На питоне никогда не кодил, но тем не менее возникла задача переслать через сокеты юникодную строку.

А>Если поступить с ней как с простой строкой, то отправляется только первый байт кодирующий каждый символ:
А>
sock.connect((HOST, PORT))
А>sock.send(unicode('привет мир'))

А>Соответственно хочется представить эту строку в виде массива байт и пропихнуть уже его, но нигде не могу найти как выполнить такое преобразование.
А>Использовать перекодирование юникода в ascii, к глубочайшему сожалению нельзя, так как там могут быть символы из разных codepage-й.

А>Заранее благодарю за дельный ответ.


для представления в виде массива байт есть struct:
import struct
...
st = Struct('=8s')
data = st.pack('01234567')
sock.sendall(data)


но имхо надо просто разобраться в чём проблема с передачей юникодта..
...coding for chaos...
Re: [python] unicode string to bytes
От: Аноним  
Дата: 04.08.09 07:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>На питоне никогда не кодил, но тем не менее возникла задача переслать через сокеты юникодную строку.

А>Если поступить с ней как с простой строкой, то отправляется только первый байт кодирующий каждый символ:
А>
sock.connect((HOST, PORT))
А>sock.send(unicode('привет мир'))

А>Соответственно хочется представить эту строку в виде массива байт и пропихнуть уже его, но нигде не могу найти как выполнить такое преобразование.
А>Использовать перекодирование юникода в ascii, к глубочайшему сожалению нельзя, так как там могут быть символы из разных codepage-й.

А>Заранее благодарю за дельный ответ.


Забыл уточнить: версия питона 2.5 так что bytes() из 3.0 не катит
Re: [python] unicode string to bytes
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 04.08.09 07:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>На питоне никогда не кодил, но тем не менее возникла задача переслать через сокеты юникодную строку.

А>Если поступить с ней как с простой строкой, то отправляется только первый байт кодирующий каждый символ:
А>
sock.connect((HOST, PORT))
А>sock.send(unicode('привет мир'))

А>Соответственно хочется представить эту строку в виде массива байт и пропихнуть уже его, но нигде не могу найти как выполнить такое преобразование.

>>> 'привет мир'.decode('koi8-r').encode('utf-8')
'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82 \xd0\xbc\xd0\xb8\xd1\x80'


Это в юниксовом шелле питона. Результат пригоден для отправки через send(). В твоём случае могут быть

— другая локальная кодировка (заменить параметр в decode)
— строка внутренне уже в юникоде (убрать вызов decode)
— другой транспортный формат (заменить utf-8 на соответствующее)
The God is real, unless declared integer.
Re[2]: [python] unicode string to bytes
От: Аноним  
Дата: 04.08.09 07:58
Оценка:
Здравствуйте, neFormal, Вы писали:

F>для представления в виде массива байт есть struct:

F>
F>import struct
F>...
F>st = Struct('=8s')
F>data = st.pack('01234567')
F>sock.sendall(data)
F>


F>но имхо надо просто разобраться в чём проблема с передачей юникодта..



struct не умеет паковать юникод, так что и это не прокатывает...
Re[2]: [python] unicode string to bytes
От: Аноним  
Дата: 04.08.09 08:04
Оценка:
Здравствуйте, netch80, Вы писали:

N>
>>>> 'привет мир'.decode('koi8-r').encode('utf-8')
N>'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82 \xd0\xbc\xd0\xb8\xd1\x80'
N>


N>Это в юниксовом шелле питона. Результат пригоден для отправки через send(). В твоём случае могут быть


N>- другая локальная кодировка (заменить параметр в decode)

N>- строка внутренне уже в юникоде (убрать вызов decode)
N>- другой транспортный формат (заменить utf-8 на соответствующее)

Тоже не прокатит. Конвертить в какой-то конкретной кодировке нельзя (например koi8-r), так как в юникодной строке могут быть символы из разных кодировок. Напимер одновременно японские иероглифы, тайские иероглифы и русский текст. Понимаю, что бред, но строка эта приходит ко мне извне, так что возиться приходится именно с ней
Re: [python] unicode string to bytes
От: Daevaorn Россия  
Дата: 04.08.09 08:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>На питоне никогда не кодил, но тем не менее возникла задача переслать через сокеты юникодную строку.

А>Если поступить с ней как с простой строкой, то отправляется только первый байт кодирующий каждый символ:
А>
sock.connect((HOST, PORT))
А>sock.send(unicode('привет мир'))

А>Соответственно хочется представить эту строку в виде массива байт и пропихнуть уже его, но нигде не могу найти как выполнить такое преобразование.
А>Использовать перекодирование юникода в ascii, к глубочайшему сожалению нельзя, так как там могут быть символы из разных codepage-й.

А>Заранее благодарю за дельный ответ.


Да банально закодировать в одну из кодировок уникода и передать. Например в utf8.

sock.send(u'привет мир'.encode('utf8'))


А вообще читайте доки по строкам в питоне, там про кодировки и прочее много инфы.
Re[2]: [python] unicode string to bytes
От: Аноним  
Дата: 04.08.09 08:15
Оценка:
Здравствуйте, Daevaorn, Вы писали:

D>Здравствуйте, Аноним, Вы писали:


D>Да банально закодировать в одну из кодировок уникода и передать. Например в utf8.


D>
D>sock.send(u'привет мир'.encode('utf8'))
D>


D>А вообще читайте доки по строкам в питоне, там про кодировки и прочее много инфы.



Тоже обрезает каждый второй байт из пары кодирующей юникодный символ.
Мне не кодировку надо поменять, а представить питоновский объект, в данном случае юникодную строку в виде массива байт.
Re[3]: [python] unicode string to bytes
От: Daevaorn Россия  
Дата: 04.08.09 09:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Тоже обрезает каждый второй байт из пары кодирующей юникодный символ.

Как вы это определили?

А>Мне не кодировку надо поменять, а представить питоновский объект, в данном случае юникодную строку в виде массива байт.


Так это самый простой способ и универсальный.
Re[4]: [python] unicode string to bytes
От: Daevaorn Россия  
Дата: 04.08.09 09:01
Оценка:
Здравствуйте, Daevaorn, Вы писали:

D>Здравствуйте, Аноним, Вы писали:


А>>Тоже обрезает каждый второй байт из пары кодирующей юникодный символ.

D>Как вы это определили?

А>>Мне не кодировку надо поменять, а представить питоновский объект, в данном случае юникодную строку в виде массива байт.


D>Так это самый простой способ и универсальный.


Правда да, можно ещё попробовать запиклить строчку.
Re[3]: [python] unicode string to bytes
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 04.08.09 09:13
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Daevaorn, Вы писали:


D>>Здравствуйте, Аноним, Вы писали:


D>>Да банально закодировать в одну из кодировок уникода и передать. Например в utf8.


D>>
D>>sock.send(u'привет мир'.encode('utf8'))
D>>


D>>А вообще читайте доки по строкам в питоне, там про кодировки и прочее много инфы.


А>Тоже обрезает каждый второй байт из пары кодирующей юникодный символ.


Простите, как это надо сделать, чтобы оно обрезало? И о какой "паре" речь, когда в utf-8 длина представления одного code point непостоянна (зависит от его числового значения)?

А>Мне не кодировку надо поменять,


А Вы её и не меняете, коллега. utf-8, и вообще все utf* — это не смена кодировки, это смена метода транспорта (UTF значит Unicode Transport Format).

А> а представить питоновский объект, в данном случае юникодную строку в виде массива байт.


Так _объект_ или _строку_? Вы всё-таки определитесь.

Если объект, то для этого нужно применить pickle, cPickle или marshal.

Если строку, то лучше всего сделать encode во что-то чётко определённое, вроде utf-32be, и в таком виде отдать в сеть. На приёмной стороне сделают аналогичный decode, и unicode строка восстановится во всей красе и полноте без повреждения.
The God is real, unless declared integer.
Re: [python] unicode string to bytes
От: Mamut Швеция http://dmitriid.com
Дата: 04.08.09 11:42
Оценка:
Hello, Anonymous, you write:

> На питоне никогда не кодил, но тем не менее возникла задача переслать через сокеты юникодную строку.

> Если поступить с ней как с простой строкой, то отправляется только первый байт кодирующий каждый символ:
>
sock.connect((HOST, PORT))
> sock.send(unicode('привет мир'))

> Соответственно хочется представить эту строку в виде массива байт и пропихнуть уже его, но нигде не могу найти как выполнить такое преобразование.
> Использовать перекодирование юникода в ascii, к глубочайшему сожалению нельзя, так как там могут быть символы из разных codepage-й.

> Заранее благодарю за дельный ответ.


взять smart_str из django.utils.encoding (описание тут)
avalon 1.0rc2 rev 295, zlib 1.2.3 (01.08.2009 02:47:12 EEST :z)(Qt 4.5.1)


dmitriid.comGitHubLinkedIn
Re[3]: [python] unicode string to bytes
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 04.08.09 13:24
Оценка:
Здравствуйте, Аноним, Вы писали:

N>>Это в юниксовом шелле питона. Результат пригоден для отправки через send(). В твоём случае могут быть


N>>- другая локальная кодировка (заменить параметр в decode)

N>>- строка внутренне уже в юникоде (убрать вызов decode)
N>>- другой транспортный формат (заменить utf-8 на соответствующее)

А>Тоже не прокатит. Конвертить в какой-то конкретной кодировке нельзя (например koi8-r), так как в юникодной строке могут быть символы из разных кодировок. Напимер одновременно японские иероглифы, тайские иероглифы и русский текст. Понимаю, что бред, но строка эта приходит ко мне извне, так что возиться приходится именно с ней :-(


Вы как раз говорите такое, что может быть сочтено только как непонимание ситуации. Если у Вас уже есть строка, у неё уже _есть_ кодировка. Так что если строка юникодная, то кодировка — юникод.

А вот какое из представлений в данном случае у вас на входе и на выходе — решайте сами. Конверсии _кодировки_ здесь нет, а конверсия формата всегда работает в прямую и затем в обратную сторону, какой бы формат ни применялся.
The God is real, unless declared integer.
Re[4]: [python] unicode string to bytes
От: Daevaorn Россия  
Дата: 04.08.09 14:04
Оценка:
Здравствуйте, netch80, Вы писали:

N>Вы как раз говорите такое, что может быть сочтено только как непонимание ситуации. Если у Вас уже есть строка, у неё уже _есть_ кодировка. Так что если строка юникодная, то кодировка — юникод.


Тут вы тоже путаете. Уникод это не кодировка (тем более в терминах питона). Это последовательность символов (оговоренных стандартом), которая может быть произвольным образом представлена в памяти и алгоритмами вокруг. Кодирование же в какой-то кодировке превращает эту последовательность в поток байтов, в строго оговоренном виде. И это уже обычная питонячья (до 3.0) строка.
Re[5]: [python] unicode string to bytes
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 04.08.09 14:42
Оценка:
Здравствуйте, Daevaorn, Вы писали:

N>>Вы как раз говорите такое, что может быть сочтено только как непонимание ситуации. Если у Вас уже есть строка, у неё уже _есть_ кодировка. Так что если строка юникодная, то кодировка — юникод.


D>Тут вы тоже путаете. Уникод это не кодировка (тем более в терминах питона).


Оппаньки. А что же это тогда? Только не надо про "последовательность символов", это получится бессмысленная игра слов. Ещё и некорректная (code point — далеко не всегда символ).

То, что юникод может быть представлен по-разному, не отменяет его свойства как кодировки.

D> Это последовательность символов (оговоренных стандартом), которая может быть произвольным образом представлена в памяти и алгоритмами вокруг. Кодирование же в какой-то кодировке превращает эту последовательность в поток байтов, в строго оговоренном виде.


То, что в питоне для удобства смешиваются понятия encoding и encoding scheme, не является основанием отрицать очевидное.
The God is real, unless declared integer.
Re: [python] unicode string to bytes
От: FR  
Дата: 06.08.09 11:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Использовать перекодирование юникода в ascii, к глубочайшему сожалению нельзя, так как там могут быть символы из разных codepage-й.


Попробуй кодировать — декодировать в base64
Re[4]: [python] unicode string to bytes
От: kmmbvnr Россия http://kmmbvnr.livejournal.com
Дата: 09.08.09 11:59
Оценка:
N>Здравствуйте, Аноним, Вы писали:

А>>Тоже обрезает каждый второй байт из пары кодирующей юникодный символ.


N>Простите, как это надо сделать, чтобы оно обрезало? И о какой "паре" речь, когда в utf-8 длина представления одного code point непостоянна (зависит от его числового значения)?


Может имеется ввиду UCS-2 кодировка?

UCS-2 (2-byte Universal Character Set) is an obsolete character encoding which is a predecessor to UTF-16. The UCS-2 encoding form is identical to that of UTF-16, except that it does not support surrogate pairs and therefore can only encode characters in the BMP range U+0000 through U+FFFF. As a consequence it is a fixed-length encoding that always encodes characters into a single 16-bit value. As with UTF-16, there are three related encoding schemes (UCS-2, UCS-2BE, UCS-2LE) that map characters to a specific byte sequence.
-- Главное про деструктор копирования не забыть --
Re[5]: [python] unicode string to bytes
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 10.08.09 10:55
Оценка:
Здравствуйте, kmmbvnr, Вы писали:

А>>>Тоже обрезает каждый второй байт из пары кодирующей юникодный символ.

N>>Простите, как это надо сделать, чтобы оно обрезало? И о какой "паре" речь, когда в utf-8 длина представления одного code point непостоянна (зависит от его числового значения)?
K>Может имеется ввиду UCS-2 кодировка?

Может. Только пусть таки ответит, интересно же из первоисточника услышать...
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.