Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 从字节流中读取utf-8字符_Python 3.x_Utf 8_Utf8 Decode - Fatal编程技术网

Python 3.x 从字节流中读取utf-8字符

Python 3.x 从字节流中读取utf-8字符,python-3.x,utf-8,utf8-decode,Python 3.x,Utf 8,Utf8 Decode,给定字节流(生成器、文件等),如何读取单个utf-8编码字符 此操作必须使用流中该字符的字节 此操作不得使用超过第一个字符的任何字节 此操作应在任何Unicode字符上成功 我可以通过滚动我自己的utf-8解码功能来实现这一点,但我不想重新发明轮子,因为我确信这个功能必须已经在其他地方用于解析utf-8字符串。用encoding='utf8'将流包装成一个字符串,然后调用.read(1) 这是假设您从一个或与之兼容的duck类型开始(即有一个read()方法)。如果您有生成器或迭代器,则可能

给定字节流(生成器、文件等),如何读取单个
utf-8
编码字符

  • 此操作必须使用流中该字符的字节
  • 此操作不得使用超过第一个字符的任何字节
  • 此操作应在任何Unicode字符上成功
我可以通过滚动我自己的
utf-8
解码功能来实现这一点,但我不想重新发明轮子,因为我确信这个功能必须已经在其他地方用于解析
utf-8
字符串。

encoding='utf8'
将流包装成一个字符串,然后调用
.read(1)

这是假设您从一个或与之兼容的duck类型开始(即有一个
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

TextIOWrapper
是否进行任何缓冲(从而消耗超过第一个字符的字节)?如果我取一个文件
f
并将其包装
wrapped=TextIOWrapper(f,'utf-8')
,调用
wrapper.read(1)
,然后再调用
f.read(1)
读取一个字节,该字节比紧跟在utf-8字符后面的字节要远得多。@arcyqwerty:
TextIOWrapper
一次读取2k字节(
\u块大小
)。它消耗的字节数超过了第一个字符所需的字节数。或者,是否有方法从包装器
TextIOWrapper
获取原始字节?在这种情况下,它似乎违反了
。此操作不得消耗流中超过第一个字符的任何字节。
是否有办法禁用缓冲?@arcyqwerty:set
\u CHUNK\u SIZE=1