2 / 2 / 1
Регистрация: 09.04.2015
Сообщений: 52

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

13.08.2015, 23:25. Показов 1488. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru