Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
2 / 2 / 1
Регистрация: 09.04.2015
Сообщений: 52

Чтение utf-8 байтов

13.08.2015, 23:25. Показов 1482. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый ночи всем, столкнулся с тем, что при чтении utf-8 байтов он не хочет воспринимать русские символы нормально:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
    def read_bytes(self, num):
        # python3 gives ordinal of byte directly
        bytes = self.rfile.read(num)
        if sys.version_info[0] < 3:
            return map(ord, bytes)
        else:
            return bytes
 
    def read_next_message(self):
 
        b1, b2 = self.read_bytes(2)
 
        fin    = b1 & FIN
        opcode = b1 & OPCODE
        masked = b2 & MASKED
        payload_length = b2 & PAYLOAD_LEN
 
        if not b1:
            print("Client closed connection.")
            self.keep_alive = 0
            return
        if opcode == CLOSE_CONN:
            print("Client asked to close connection.")
            self.keep_alive = 0
            return
        if not masked:
            print("Client must always be masked.")
            self.keep_alive = 0
            return
 
        if payload_length == 126:
            payload_length = struct.unpack(">H", self.rfile.read(2))[0]
        elif payload_length == 127:
            payload_length = struct.unpack(">Q", self.rfile.read(8))[0]
 
        masks = self.read_bytes(4)
        decoded = ""
        for char in self.read_bytes(payload_length):
            char ^= masks[len(decoded) % 4]
            decoded += chr(char)
        self.server._message_received_(self, decoded)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
'''
+-+-+-+-+-------+-+-------------+-------------------------------+
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len |    Extended payload length    |
|I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
|N|V|V|V|       |S|             |   (if payload len==126/127)   |
| |1|2|3|       |K|             |                               |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
|     Extended payload length continued, if payload len == 127  |
+ - - - - - - - - - - - - - - - +-------------------------------+
|                     Payload Data continued ...                |
+---------------------------------------------------------------+
'''
 
FIN    = 0x80
OPCODE = 0x0f
MASKED = 0x80
PAYLOAD_LEN = 0x7f
PAYLOAD_LEN_EXT16 = 0x7e
PAYLOAD_LEN_EXT64 = 0x7f
 
OPCODE_TEXT = 0x01
CLOSE_CONN  = 0x8
В чём может быть проблема? Уже третий день думаю над это проблемой.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.08.2015, 23:25
Ответы с готовыми решениями:

Чтение определенного количества байтов
Здраствуйте! Есть файл a.txt содержание которого: a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaa

Выполнить чтение всех байтов с файла с помощью FileInputStream в массив байтов
Выполнить чтение всех байтов с файла с помощью FileInputStream в массив байтов. Создать строку на основе прочитанного массива байтов и...

Дозапись байтов UTF-8 without BOM
Добрый день. Дозаписываю байты из массива следующим образом: Stream fs = new FileStream(&quot;C:\\AES\\Шифр-текст.txt&quot;,...

8
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
14.08.2015, 07:02
Что-то у вас странный инструментарий какой-то.
Что есть self.rfile? Если бы вопрос был про стандартные питоновские инструменты - можно было бы ответить, а так - нет.
В крайнем случае, str.decode (|encode) вам в помощь.
0
2 / 2 / 1
Регистрация: 09.04.2015
Сообщений: 52
14.08.2015, 12:35  [ТС]
dondublon, rfile - из стандартной библиотеки:
Python
1
2
3
4
if sys.version_info[0] < 3 :
    from SocketServer import ThreadingMixIn, TCPServer, StreamRequestHandler
else:
    from socketserver import ThreadingMixIn, TCPServer, StreamRequestHandler
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
14.08.2015, 12:42
А, понятно. Тогда пардон.
0
2 / 2 / 1
Регистрация: 09.04.2015
Сообщений: 52
14.08.2015, 13:23  [ТС]
dondublon, а через данную функцию выдаётся такая ошибка:

Python
1
2
3
4
5
6
7
8
def try_decode_UTF8(data):
    print('try_decode_utf8: 0 {0} 1 {1}'.format(data, data.decode('utf-8')))
    try:
        return data.decode('utf-8')
    except UnicodeDecodeError:
        return False
    except Exception as e:
        raise(e)
Python
1
2
 return data.decode('utf-8')
AttributeError: 'str' object has no attribute 'decode'
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
14.08.2015, 13:30
В 3-м питоне у строки нет метода decode, только encode. По 3-му я не очень в курсе, сижу на 2-м.
0
2 / 2 / 1
Регистрация: 09.04.2015
Сообщений: 52
14.08.2015, 13:53  [ТС]
dondublon, если использовать encode - получается b'sdasd\x01\...' русские символы в байтах. проблема заключается в тех 2 функциях, что я указал в начале.

Добавлено через 4 минуты
Провёл несколько тестов, если отправлять с клиента русские символы - они превращаются неизвестно во что: "Привет", а если на сервере делать уже русские символы и отправлять клиенту - все нормально.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
14.08.2015, 14:03
А что значит "не хочет воспринимать"?
Вы получили юникодную строку, что дальше, кто её не так отображает?
0
2 / 2 / 1
Регистрация: 09.04.2015
Сообщений: 52
16.08.2015, 00:15  [ТС]
dondublon, я получаю не строку, а байты, байты обрабатываются теми функциями, что указаны в начале топика. В них видимо и проблема, поскольку они отказываются обрабатывать русские символы, а вернее криво их обрабатывают.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.08.2015, 00:15
Помогаю со студенческими работами здесь

Перевод последовательности байтов в строку UTF-8
Получаю по сети строку в UTF-8 (то есть читаю из порта набор байт, содержащих сроку в формате UTF-8). Как можно перевести этот набор байт...

Чтение байтов
Ребят, здравствуйте , nомогите разобраться , есть бинарный файл , в нем данные заnисанные в структурах , и в файле 1-е 4 байта это кол-во...

Чтение байтов из потока
Метод Read считывает байты до 1956(надо 40 000) символа а дальше в массиве buffer идут нули, с функцией ReadByte всё работает. Почему так?...

Чтение байтов из порта
Записываю одни и те же данные в порт, устройство отвечает произвольное количество раз, и через сниффер видно что запись в порт идет, а вот...

Объединение и чтение байтов
Доброго и с наступающим! :drink: Работаю с байтами, и необходимо объединять две переменные в одну, тоесть типа так: TByteDynArray...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru