Cra*_*een 3 encoding python-3.x
Python 3清理了Python对Unicode字符串的处理.我认为,作为这项工作的一部分,根据Python 3文档与Python 2文档相比,Python 3中的编解码器变得更加严格.
例如,已经删除了从概念上将字节流转换为不同形式的字节流的编解码器:
从概念上将Unicode转换为不同形式的Unicode的编解码器也已被删除(在Python 2中,它实际上介于Unicode和字节流之间,但从概念上讲,它实际上是我认为Unicode的Unicode):
我的主要问题是,Python 3中"删除编解码器"的"正确方法"是做什么的?它们不是严格意义上的编解码器,而是"转换".但是接口和实现与编解码器非常相似.
我不关心rot_13,但我很想知道实现行结尾样式转换的"最佳方法"(Unix行结尾与Windows行结尾),这应该是Unicode-to-Unicode在编码到字节流之前完成转换,特别是在使用UTF-16时,正如其他SO问题所讨论的那样.
看起来所有这些非编解码器模块都是根据具体情况进行处理的.这是我到目前为止所发现的:
我想这意味着没有用于创建此类字符串/字节数组转换模块的标准框架,但它们是在Python 3中逐个完成的.
一个关于"使用Python的Unicode支持压缩文本"一博客文章评论提醒我一个事实,即这些编解码器是回来为Python 3.2.
引用评论:
但是,由于这些是"文本到文本"或"二进制到二进制"转换,Python 3.x中的encode()/ decode()方法不支持这种使用方式 - 它是Python 2. x唯一的功能).
编解码器本身又回到3.2中,但是你需要通过编解码器模块API来使用它们 - 它们不能通过对象方法速记来获得.
您是否知道Python 2提供了一些编解码器来进行有趣的转换,例如Caeser旋转(即rot13)?因此,您可以执行以下操作:
Run Code Online (Sandbox Code Playgroud)>>> 'foo'.encode('rot-13') 'sbb'
这在Python 3中不起作用,因为即使某些str-to-str编解码器如rot-13仍然存在,str.encode()接口也要求编解码器返回一个bytes对象.为了在Python 2和Python 3中使用str-to-str编解码器,你必须使用低级API,直接获取和调用编解码器:
Run Code Online (Sandbox Code Playgroud)>>> from codecs import getencoder >>> encoder = getencoder('rot-13') >>> rot13string = encoder(mystring)[0]
由于编解码器API,您必须从编码器的返回值中获取第0个元素.有点难看,但它适用于两个版本的Python.