Python 3中的流/字符串/字节数组转换

Cra*_*een 3 encoding python-3.x

Python 3清理了Python对Unicode字符串的处理.我认为,作为这项工作的一部分,根据Python 3文档Python 2文档相比,Python 3中的编解码器变得更加严格.

例如,已经删除了从概念上将字节流转换为不同形式的字节流的编解码器:

  • base64_codec
  • bz2_codec
  • hex_codec

从概念上将Unicode转换为不同形式的Unicode的编解码器也已被删除(在Python 2中,它实际上介于Unicode和字节流之间,但从概念上讲,它实际上是我认为Unicode的Unicode):

  • rot_13

我的主要问题是,Python 3中"删除编解码器"的"正确方法"是做什么的?它们不是严格意义上的编解码器,而是"转换".但是接口和实现与编解码器非常相似.

我不关心rot_13,但我很想知道实现行结尾样式转换的"最佳方法"(Unix行结尾与Windows行结尾),这应该是Unicode-to-Unicode在编码到字节流之前完成转换,特别是在使用UTF-16时,正如其他SO问题所讨论的那样.

Cra*_*een 6

看起来所有这些非编解码器模块都是根据具体情况进行处理的.这是我到目前为止所发现的:

  • base64现在可通过base64模块使用
  • bz2现在可以使用bz2模块完成
  • 十六进制字符串编码/解码可以使用binascii模块hexlifyunhexlify函数完成(一些隐藏的功能)

我想这意味着没有用于创建此类字符串/字节数组转换模块的标准框架,但它们是在Python 3中逐个完成的.

Python 3.2的更新

一个关于"使用Python的Unicode支持压缩文本"一博客文章评论提醒我一个事实,即这些编解码器是回来为Python 3.2.

引用评论:

但是,由于这些是"文本到文本"或"二进制到二进制"转换,Python 3.x中的encode()/ decode()方法不支持这种使用方式 - 它是Python 2. x唯一的功能).

编解码器本身又回到3.2中,但是你需要通过编解码器模块API来使用它们 - 它们不能通过对象方法速记来获得.

Python 3文档中查找codecs- 二进制转换.

来自Barry Warsaw的博客文章:

您是否知道Python 2提供了一些编解码器来进行有趣的转换,例如Caeser旋转(即rot13)?因此,您可以执行以下操作:

>>> 'foo'.encode('rot-13')
'sbb'
Run Code Online (Sandbox Code Playgroud)

这在Python 3中不起作用,因为即使某些str-to-str编解码器如rot-13仍然存在,str.encode()接口也要求编解码器返回一个bytes对象.为了在Python 2和Python 3中使用str-to-str编解码器,你必须使用低级API,直接获取和调用编解码器:

>>> from codecs import getencoder
>>> encoder = getencoder('rot-13')
>>> rot13string = encoder(mystring)[0]
Run Code Online (Sandbox Code Playgroud)

由于编解码器API,您必须从编码器的返回值中获取第0个元素.有点难看,但它适用于两个版本的Python.