首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么codecs.iterdecode()吃空字符串?

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

Stack Overflow用户
提问于 2017-05-11 00:02:50
回答 1查看 1K关注 0票数 6

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

代码语言:javascript
复制
>>> 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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-11 00:17:36

这很正常。iterdecode在编码块上使用迭代器,并在解码块上返回迭代器,但它不能保证一对一的通信。它所保证的是所有输出块的级联是对所有输入块的级联的有效解码。

如果您查看源代码,您将看到它显式地丢弃了空的输出块:

代码语言:javascript
复制
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存在的原因,以及您不只是自己对所有块调用decode的原因,是解码过程是有状态的。一个字符的UTF-8编码形式可能被分割成多个块.其他编解码器可能会有非常奇怪的有状态行为,比如一个字节序列,它反转所有字符的大小写,直到你再次看到那个字节序列。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43904440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档