gpt4 book ai didi

python - 如何将最长的子字节解码为 str?

转载 作者:太空宇宙 更新时间:2023-11-04 02:08:04 25 4
gpt4 key购买 nike

假设我从某处读取了一个很长的 bytes 对象,知道它是 utf-8 编码的。但是读取可能不会完全消耗可用内容,因此流中的最后一个字符可能不完整。在此对象上调用 bytes.decode() 可能会导致解码错误。但真正失败的只是最后几个字节。在这种情况下是否有一个函数可以返回最长的解码字符串和剩余字节?

utf-8 最多将一个字符编码为 4 个字节,因此尝试对截断的字节进行解码应该可行,但绝大多数计算将被浪费,我不太喜欢这种解决方案.

举个简单但具体的例子:

>>> b0 = b'\xc3\x84\xc3\x96\xc3'
>>> b1 = b'\x9c\xc3\x84\xc3\x96\xc3\x9c'
>>> (b0 + b1).decode()
>>> 'ÄÖÜÄÖÜ'

(b0 + b1).decode() 没问题,但是 b0.decode() 会提高。该解决方案应该能够尽可能多地解码b0,并返回无法解码的字节。

最佳答案

您正在描述 io.TextIOWrapper 的基本用法:二进制流上的缓冲文本流。

>>> import io 
>>> txt = 'before\N{PILE OF POO}after'
>>> b = io.BytesIO(txt.encode('utf-8'))
>>> t = io.TextIOWrapper(b)
>>> t.read(5)
'befor'
>>> t.read(1)
'e'
>>> t.read(1)
'💩'
>>> t.read(1)
'a'

与直接读取字节流对比,后者可能会中途读取编码的便便堆:

>>> b.seek(0) 
0
>>> b.read(5)
b'befor'
>>> b.read(1)
b'e'
>>> b.read(1)
b'\xf0'
>>> b.read(1)
b'\x9f'
>>> b.read(1)
b'\x92'
>>> b.read(1)
b'\xa9'
>>> b.read(1)
b'a'

如果您想要显式,请指定 encoding="utf-8"。默认编码,即 locale.getpreferredencoding(False),通常是 utf-8。

关于python - 如何将最长的子字节解码为 str?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54207785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com