gpt4 book ai didi

python - 为什么 codecs.iterdecode() 吃空字符串?

转载 作者:太空狗 更新时间:2023-10-30 01:12:17 29 4
gpt4 key购买 nike

为什么下面两种解码方式返回的结果不同?

>>> import codecs
>>>
>>> data = ['', '', 'a', '']
>>> list(codecs.iterdecode(data, 'utf-8'))
[u'a']
>>> [codecs.decode(i, 'utf-8') for i in data]
[u'', u'', u'a', u'']

这是错误还是预期行为?我的 Python 版本 2.7.13。

最佳答案

这是正常的。 iterdecode 在编码 block 上获取一个迭代器,并在解码 block 上返回一个迭代器,但它不保证一对一对应。它只保证所有输出 block 的串联是对所有输入 block 的串联的有效解码。

如果您查看 source code ,你会看到它明确地丢弃了空的输出​​ block :

def iterdecode(iterator, encoding, errors='strict', **kwargs):
"""
Decoding iterator.
Decodes the input strings from the iterator using an IncrementalDecoder.
errors and kwargs are passed through to the IncrementalDecoder
constructor.
"""
decoder = getincrementaldecoder(encoding)(errors, **kwargs)
for input in iterator:
output = decoder.decode(input)
if output:
yield output
output = decoder.decode("", True)
if output:
yield output

请注意 iterdecode 存在的原因,以及您不会自己对所有 block 调用 decode 的原因,是解码过程是有状态的。一个字符的 UTF-8 编码形式可能会分成多个 block 。其他编解码器可能具有非常奇怪的状态行为,例如可能会反转所有字符大小写的字节序列,直到您再次看到该字节序列。

关于python - 为什么 codecs.iterdecode() 吃空字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43904440/

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