Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 1, 2012 16:04:30

sonniy
От:
Зарегистрирован: 2009-12-18
Сообщения: 84
Репутация: +  0  -
Профиль   Отправить e-mail  

Определение символов UTF8 из бинарного кода(нужна помощь)

есть вот такая таблица(оригинал) :

Unicode UTF-8 Представленные символы
0x00000000 — 0x0000007F 0xxxxxxx ASCII, в том числе латинский алфавит, простейшие знаки препинания и арабские цифры
0x00000080 — 0x000007FF 110xxxxx 10xxxxxx кириллица, расширенная латиница, арабский, армянский, греческий, еврейский и коптский алфавит; сирийское письмо, тана, нко; МФА; некоторые знаки препинания
0x00000800 — 0x0000FFFF 1110xxxx 10xxxxxx 10xxxxxx все другие современные формы письменности, в том числе грузинский алфавит, индийское, китайское, корейское и японское письмо; сложные знаки препинания; математические и другие специальные символы
0x00010000 — 0x001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx музыкальные символы, редкие китайские иероглифы, вымершие формы письменности

с хексовыми значениями понятно:
0 — 127 занимает один байт
128 — 2047 два байта
2048 — 65535 три байта
65535 — 2097151 четыре байта
это номера символов, достать их можно так:

>>> unichr(2047)
u'\u07ff'
посмотреть его вид так :
>>> print unichr(2047)
߿
убедится сколько он занимает байт так :
>>> len(unichr(2047).encode('utf8'))
2
стоит задача принимать информацию которая выглядит примерно так :
11000000 10000000 11010100 10001000 11000110 10000001 11000111 10110000 11001001 10111111

я знаю что это бинарные значения символов utf8, но не знаю как их конвертировать к нормальному виду

может кто нибудь сталкивался с подобной ситуацией?



Офлайн

#2 Фев. 1, 2012 16:44:09

sonniy
От:
Зарегистрирован: 2009-12-18
Сообщения: 84
Репутация: +  0  -
Профиль   Отправить e-mail  

Определение символов UTF8 из бинарного кода(нужна помощь)

нашел как конвертировать в hex и обратно :
вариант 1:

>>> import binascii
>>> binascii.b2a_hex('h')
'68'
>>> binascii.a2b_hex('68')
'h'
>>> chr(int('68',16))
'h'
вариант 2:
>>> 'h'.encode('hex_codec')
'68'
>>> '68'.decode('hex_codec')
'h'
ограничено символами ASCII



Отредактировано (Фев. 1, 2012 16:54:13)

Офлайн

#3 Фев. 2, 2012 01:12:27

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9879
Репутация: +  853  -
Профиль   Отправить e-mail  

Определение символов UTF8 из бинарного кода(нужна помощь)

в третьем питоне

>>> s = '11010100 10001000 11000110 10000001 11000111 10110000 11001001 10111111'
>>> b = bytes(int(octet, 2) for octet in s.split())
>>> b
b'\xd4\x88\xc6\x81\xc7\xb0\xc9\xbf'
>>> b.decode()
'ԈƁǰɿ'
>>>



Офлайн

#4 Фев. 2, 2012 11:00:52

sonniy
От:
Зарегистрирован: 2009-12-18
Сообщения: 84
Репутация: +  0  -
Профиль   Отправить e-mail  

Определение символов UTF8 из бинарного кода(нужна помощь)

я так понимаю , что можно иногда нарваться на несуществующий символ :

>>> s='1110001 10001101 10110111'
>>> b = bytes(int(octet, 2) for octet in s.split())
>>> b.decode()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf8' codec can't decode byte 0x8d in position 1: invalid start byte
>>> b
b'q\x8d\xb7'
>>> s='11100000 10001101 10110111 00000001'
>>> b = bytes(int(octet, 2) for octet in s.split())
>>> b
b'\xe0\x8d\xb7\x01'
>>> b.decode()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-1: invalid continuation byte
это следствие того, что номеров символов меньше чем комбинаций с байтами
я сначала грешил на проблему декода с трехбайтового, но :
>>> s='11100010 10001101 10110111'
>>> b = bytes(int(octet, 2) for octet in s.split())
>>> b.decode()
'&#9079;'
все как видите нормально, жаль что 2.х питон не поддерживает такие вещи



Офлайн

#5 Фев. 2, 2012 12:11:24

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

Определение символов UTF8 из бинарного кода(нужна помощь)

sonniy
жаль что 2.х питон не поддерживает такие вещи
какие?
>>> s='11100010 10001101 10110111'
>>> b = ''.join([chr(int(octet, 2)) for octet in s.split()])
>>> print b.decode('utf8')
&#9079;

Офлайн

#6 Фев. 2, 2012 13:59:09

sonniy
От:
Зарегистрирован: 2009-12-18
Сообщения: 84
Репутация: +  0  -
Профиль   Отправить e-mail  

Определение символов UTF8 из бинарного кода(нужна помощь)

Спасибо за помощь !

возник еще один вопрос :
может есть какой то способ переслать сообщение именно в байтовом виде ?
интересует передача такого рода через сокетное соединение

import socket
HOST = "127.0.0.1"
PORT = 7755

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
data = u'могучая стринга'
byte = bytes([int('11100010',2)])

sock.send(byte+data)
суть в том чтобы всунуть перед сообщениями не символ а именно байт и именно такой как мне хочется …



Офлайн

#7 Фев. 2, 2012 16:14:50

nerijus
От:
Зарегистрирован: 2010-06-03
Сообщения: 93
Репутация: +  1  -
Профиль   Отправить e-mail  

Определение символов UTF8 из бинарного кода(нужна помощь)

Для преобразования смотри модуль struct.



Офлайн

#8 Фев. 2, 2012 17:09:39

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

Определение символов UTF8 из бинарного кода(нужна помощь)

> суть в том чтобы всунуть перед сообщениями не символ а именно байт и именно такой как мне хочется …

обычная “строка” является набором байтов, конвертировать “число в байт” и обратно можно через: chr, ord. строку u'abc' через encode, decode.
см это

Офлайн

#9 Фев. 22, 2012 07:43:42

sonniy
От:
Зарегистрирован: 2009-12-18
Сообщения: 84
Репутация: +  0  -
Профиль   Отправить e-mail  

Определение символов UTF8 из бинарного кода(нужна помощь)

Спасибо, очень помогло



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version