Чтение символа utf-8 из потока байтов

Учитывая поток байтов (генератор, файл и т. Д.), Как я могу прочитать один utf-8 закодированный символ?

  • Эта операция должна потреблять байты этого символа из потока.
  • Эта операция не должна использовать байты потока, которые превышают первый символ.
  • Эта операция должна быть успешной для любого символа Unicode.

Я мог бы подойти к этому, свернув свой utf-8 функция декодирования, но я бы предпочел не изобретать велосипед, так как я уверен, что эта функция уже используется для анализа в другом месте utf-8 строки.

1 ответ

Решение

Оберните поток в TextIOWrapper с encoding='utf8' затем позвоните .read(1) в теме.

Это предполагает, что вы начали с BufferedIOBase или что-то типа утки совместимо с ним (т.е. имеет read() метод). Если у вас есть генератор или итератор, вам может потребоваться адаптировать интерфейс.

Пример:

from io import TextIOWrapper

with open('/path/to/file', 'rb') as f:
  wf = TextIOWrapper(f, 'utf-8')
  wf._CHUNK_SIZE = 1  # Implementation detail, may not work everywhere

  wf.read(1) # gives next utf-8 encoded character
  f.read(1)  # gives next byte
Другие вопросы по тегам