На питоне никогда не кодил, но тем не менее возникла задача переслать через сокеты юникодную строку.
Если поступить с ней как с простой строкой, то отправляется только первый байт кодирующий каждый символ:
Соответственно хочется представить эту строку в виде массива байт и пропихнуть уже его, но нигде не могу найти как выполнить такое преобразование.
Использовать перекодирование юникода в ascii, к глубочайшему сожалению нельзя, так как там могут быть символы из разных codepage-й.
Здравствуйте, Аноним, Вы писали:
А>На питоне никогда не кодил, но тем не менее возникла задача переслать через сокеты юникодную строку. А>Если поступить с ней как с простой строкой, то отправляется только первый байт кодирующий каждый символ: А>
А>Соответственно хочется представить эту строку в виде массива байт и пропихнуть уже его, но нигде не могу найти как выполнить такое преобразование. А>Использовать перекодирование юникода в 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
Оценка:
Здравствуйте, Аноним, Вы писали:
А>На питоне никогда не кодил, но тем не менее возникла задача переслать через сокеты юникодную строку. А>Если поступить с ней как с простой строкой, то отправляется только первый байт кодирующий каждый символ: А>
А>Соответственно хочется представить эту строку в виде массива байт и пропихнуть уже его, но нигде не могу найти как выполнить такое преобразование. А>Использовать перекодирование юникода в ascii, к глубочайшему сожалению нельзя, так как там могут быть символы из разных codepage-й.
А>Заранее благодарю за дельный ответ.
Забыл уточнить: версия питона 2.5 так что bytes() из 3.0 не катит
Здравствуйте, Аноним, Вы писали:
А>На питоне никогда не кодил, но тем не менее возникла задача переслать через сокеты юникодную строку. А>Если поступить с ней как с простой строкой, то отправляется только первый байт кодирующий каждый символ: А>
Это в юниксовом шелле питона. Результат пригоден для отправки через 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>
N>Это в юниксовом шелле питона. Результат пригоден для отправки через send(). В твоём случае могут быть
N>- другая локальная кодировка (заменить параметр в decode) N>- строка внутренне уже в юникоде (убрать вызов decode) N>- другой транспортный формат (заменить utf-8 на соответствующее)
Тоже не прокатит. Конвертить в какой-то конкретной кодировке нельзя (например koi8-r), так как в юникодной строке могут быть символы из разных кодировок. Напимер одновременно японские иероглифы, тайские иероглифы и русский текст. Понимаю, что бред, но строка эта приходит ко мне извне, так что возиться приходится именно с ней
Здравствуйте, Аноним, Вы писали:
А>На питоне никогда не кодил, но тем не менее возникла задача переслать через сокеты юникодную строку. А>Если поступить с ней как с простой строкой, то отправляется только первый байт кодирующий каждый символ: А>
А>Соответственно хочется представить эту строку в виде массива байт и пропихнуть уже его, но нигде не могу найти как выполнить такое преобразование. А>Использовать перекодирование юникода в 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>А вообще читайте доки по строкам в питоне, там про кодировки и прочее много инфы.
Тоже обрезает каждый второй байт из пары кодирующей юникодный символ.
Мне не кодировку надо поменять, а представить питоновский объект, в данном случае юникодную строку в виде массива байт.
Здравствуйте, Аноним, Вы писали:
А>Тоже обрезает каждый второй байт из пары кодирующей юникодный символ.
Как вы это определили?
А>Мне не кодировку надо поменять, а представить питоновский объект, в данном случае юникодную строку в виде массива байт.
Здравствуйте, Daevaorn, Вы писали:
D>Здравствуйте, Аноним, Вы писали:
А>>Тоже обрезает каждый второй байт из пары кодирующей юникодный символ. D>Как вы это определили?
А>>Мне не кодировку надо поменять, а представить питоновский объект, в данном случае юникодную строку в виде массива байт.
D>Так это самый простой способ и универсальный.
Правда да, можно ещё попробовать запиклить строчку.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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 строка восстановится во всей красе и полноте без повреждения.
Hello, Anonymous, you write:
> На питоне никогда не кодил, но тем не менее возникла задача переслать через сокеты юникодную строку. > Если поступить с ней как с простой строкой, то отправляется только первый байт кодирующий каждый символ: >
> Соответственно хочется представить эту строку в виде массива байт и пропихнуть уже его, но нигде не могу найти как выполнить такое преобразование. > Использовать перекодирование юникода в ascii, к глубочайшему сожалению нельзя, так как там могут быть символы из разных codepage-й.
> Заранее благодарю за дельный ответ.
Здравствуйте, Аноним, Вы писали:
N>>Это в юниксовом шелле питона. Результат пригоден для отправки через send(). В твоём случае могут быть
N>>- другая локальная кодировка (заменить параметр в decode) N>>- строка внутренне уже в юникоде (убрать вызов decode) N>>- другой транспортный формат (заменить utf-8 на соответствующее)
А>Тоже не прокатит. Конвертить в какой-то конкретной кодировке нельзя (например koi8-r), так как в юникодной строке могут быть символы из разных кодировок. Напимер одновременно японские иероглифы, тайские иероглифы и русский текст. Понимаю, что бред, но строка эта приходит ко мне извне, так что возиться приходится именно с ней :-(
Вы как раз говорите такое, что может быть сочтено только как непонимание ситуации. Если у Вас уже есть строка, у неё уже _есть_ кодировка. Так что если строка юникодная, то кодировка — юникод.
А вот какое из представлений в данном случае у вас на входе и на выходе — решайте сами. Конверсии _кодировки_ здесь нет, а конверсия формата всегда работает в прямую и затем в обратную сторону, какой бы формат ни применялся.
Здравствуйте, netch80, Вы писали:
N>Вы как раз говорите такое, что может быть сочтено только как непонимание ситуации. Если у Вас уже есть строка, у неё уже _есть_ кодировка. Так что если строка юникодная, то кодировка — юникод.
Тут вы тоже путаете. Уникод это не кодировка (тем более в терминах питона). Это последовательность символов (оговоренных стандартом), которая может быть произвольным образом представлена в памяти и алгоритмами вокруг. Кодирование же в какой-то кодировке превращает эту последовательность в поток байтов, в строго оговоренном виде. И это уже обычная питонячья (до 3.0) строка.
Здравствуйте, Daevaorn, Вы писали:
N>>Вы как раз говорите такое, что может быть сочтено только как непонимание ситуации. Если у Вас уже есть строка, у неё уже _есть_ кодировка. Так что если строка юникодная, то кодировка — юникод.
D>Тут вы тоже путаете. Уникод это не кодировка (тем более в терминах питона).
Оппаньки. А что же это тогда? Только не надо про "последовательность символов", это получится бессмысленная игра слов. Ещё и некорректная (code point — далеко не всегда символ).
То, что юникод может быть представлен по-разному, не отменяет его свойства как кодировки.
D> Это последовательность символов (оговоренных стандартом), которая может быть произвольным образом представлена в памяти и алгоритмами вокруг. Кодирование же в какой-то кодировке превращает эту последовательность в поток байтов, в строго оговоренном виде.
То, что в питоне для удобства смешиваются понятия encoding и encoding scheme, не является основанием отрицать очевидное.
Здравствуйте, Аноним, Вы писали:
А>Использовать перекодирование юникода в ascii, к глубочайшему сожалению нельзя, так как там могут быть символы из разных codepage-й.
N>Здравствуйте, Аноним, Вы писали:
А>>Тоже обрезает каждый второй байт из пары кодирующей юникодный символ.
N>Простите, как это надо сделать, чтобы оно обрезало? И о какой "паре" речь, когда в utf-8 длина представления одного code point непостоянна (зависит от его числового значения)?
Здравствуйте, kmmbvnr, Вы писали:
А>>>Тоже обрезает каждый второй байт из пары кодирующей юникодный символ. N>>Простите, как это надо сделать, чтобы оно обрезало? И о какой "паре" речь, когда в utf-8 длина представления одного code point непостоянна (зависит от его числового значения)? K>Может имеется ввиду UCS-2 кодировка?
Может. Только пусть таки ответит, интересно же из первоисточника услышать...