Чтение символа 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