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

2024-03-10

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

>>> 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接受编码块上的迭代器并返回解码块上的迭代器,但它不保证一对一的对应关系。它所保证的是所有输出块的串联是所有输入块的串联的有效解码。

如果你看一下源代码 https://github.com/python/cpython/blob/2.7/Lib/codecs.py#L1029,您会看到它显式丢弃空输出块:

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 编码形式可能会被分割成多个块。其他编解码器可能具有非常奇怪的有状态行为,例如可能会反转所有字符的大小写的字节序列,直到您再次看到该字节序列。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 codecs.iterdecode() 吃空字符串? 的相关文章

随机推荐

  • 在浏览器关闭选项卡或浏览器退出时运行方法

    是否有一个可以在 Javascript Angular JQuery 中使用的操作处理程序 可以安排在 Web 浏览器中关闭选项卡之前执行的方法 关闭我的意思是退出浏览器或关闭选项卡或崩溃或其他什么 是的 你只需绑定beforeunload
  • 如何在java中从周数、年份和星期几获取日期?

    我有周数 相应的年份和周数 即 1 表示星期一 2 表示星期二 依此类推 有没有办法在java中找到带有这些信息的日期 以下是我在网上找到的一个方法 int week 51 LocalDate wkstart LocalDate now w
  • 如何避免 VBA 中的默认属性陷阱?

    我只是偶尔使用 VBA 每次我回到 VBA 时 我都会遇到以下一些变化 我有一个Range目的 currentCell 我用它来跟踪我在电子表格中使用的单元格 当我更新它以指向不同的单元格时 我写道 currentCell currentC
  • Django - 网站主页

    我一直在研究 Django 从我所看到的来看 它真是太棒了 然而 我有点困惑 如何为我的网站实现 主页 它是一个单独的应用程序 还是只是项目中的一个视图 还是什么 对此没有真正的规则 但我喜欢做的一件事实际上是安排索引访问重定向到另一个位置
  • html 元素上的 title 属性有什么用?

    html 元素上的 title 属性有什么用 div class myDiv title This is the title Stuff div 它的目的是用作工具提示吗 它还有什么进一步的用处吗 差不多了 HTML 规范称之为咨询文本 h
  • 如何在Cron上动态设置变量?

    我正在尝试将 cron 文件放置在 etc croon 中 d 我的问题是我不想保持此文件更新 所以我正在寻找一种从文件动态获取软件版本的方法 我几乎没有其他变量 但现在我认为问题在于 cat software VERSION 它在 she
  • 在 jQuery 中取消延迟的 Promise

    如何在不从 DOM 中删除元素的情况下取消 Promise fiddle http jsfiddle net ripper234 LG9eZ 4 我运行了这段代码 box delay 2000 show slow delay 2000 pr
  • MonadFix 用严格的语言

    我正在为 Ocaml 中类似 haskell 的 do 表示法开发 camlp4 扩展 并试图弄清楚 GHC 如何编译递归 do 绑定 使用 XDoRec 启用 我想知道一元定点组合器是否可能以严格的语言存在 如 Ocaml F SML 如
  • Codeigniter 中的“gd-jpeg、libjpeg:可恢复错误:JPEG 文件过早结束”

    我正在使用 CodeIgniter 并尝试创建图像的拇指 我在某些情况下取得了成功 但在某些情况下失败了 我收到以下错误 lt lt A PHP Error was encountered Severity Notice Message i
  • 如何在没有 br 的情况下在 html 中进行换行 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有很多内容 我将把它上传到我的网站 在网站中它看起来没有换行符 添加内容需要花费很多时间 br 还有其他方法可以断线吗
  • 索引 API 403 权限被拒绝。无法验证 URL 所有权

    我想执行示例中的代码 require once google api php client vendor autoload php client new Google Client service account file json is
  • Jquery Mobile页面的Loading()方法是如何工作的?

    我是 Jquery Mobile 的新手 并在重新开发此移动网站时尝试学习它 因此 我使用 data role page 使用不同的 div 进行所有导航 并使用 pagename 进行导航 我的问题是以这种方式进行导航 如何使用加载消息并
  • ParseImageView 是否缓存 ParseFile

    ParseImageView 是否缓存 Android 中的 ParseFile 如果它缓存了 parseFile 我如何在我的 Android 设备中找到这些文件的路径 ParseImageView imageView ParseImag
  • Laravel:如何对忽略某种语言文章的雄辩集合进行排序?

    在 Laravel 中 有没有什么方法可以对集合进行排序而忽略某种语言中的文章 例如英语中的 a an the 西班牙语中的 el la 等 我想要类似的东西jQuery 表排序器 https mottie github io tables
  • 订阅后进行条带收费,从订阅中获取元数据

    当我创建订阅时 我设置了一些元数据来标识我在数据库上的订单 当我收到 webhook 时charge succeeded订阅中的元数据未在此事件中传递 我无法识别与此付款相关的订单 如何发送与订阅相关的每个 Webhook 上的元数据 订阅
  • 如何设置 checkbox.isChecked 而不引发事件

    有没有办法检查CheckBox而不运行与检查相关的代码 只是为了视觉外观 Edit private void normalCheck Checked object sender RoutedEventArgs e normal 想象一下我想
  • 固定功能与固定功能着色器 - 帮助理解概念差异

    我的背景 几个月前 我第一次开始尝试 OpenGL 没有什么特殊目的 只是为了好玩 我开始阅读 OpenGL 红皮书 并最终了解了如何制作一个具有多种不同光照的行星系统 这种情况持续了一个月 我对 openGL 的兴趣就消失了 大约一周前它
  • Python 跳过函数中的参数

    初学者在这里 我只想知道如何在 python 中跳过参数 def function a b pass function 5 我只想将 5 分配给 b 我该怎么做 你可以这样做 def function a None b None pass
  • 如何防止 .NET 应用程序从 GAC 加载/引用程序集?

    我可以以引用 本地 程序集 而不是在 Visual Studio 中的方式 的方式 Visual Studio 中的设置 配置 NET 应用程序吗 GAC http en wikipedia org wiki Global Assembly
  • 为什么 codecs.iterdecode() 吃空字符串?

    为什么以下两种解码方法返回不同的结果 gt gt gt import codecs gt gt gt gt gt gt data a gt gt gt list codecs iterdecode data utf 8 u a gt gt