Python 3清理了Python对Unicode字符串的处理。我认为,作为这项工作的一部分,根据Python 3文档与Python 2文档相比,Python3中的编解码器已经变得更加严格。
例如,从概念上将字节流转换为不同形式的字节流的编解码器已被删除:
还删除了从概念上将Unicode转换为不同形式Unicode的编解码器(在Python 2中,它实际上介于Unicode和字节流之间,但从概念上说,它实际上是Unicode到Unicode ):
我的主要问题是,在Python3中有什么“正确的方法”来做这些删除的编解码器以前做的事情?--它们不是严格意义上的编解码器,而是“转换”。但是接口和实现将非常类似于编解码器。
我不关心rot_13,但我想知道实现行结束样式转换的“最佳方式”(Unix行尾与Windows行尾),这应该是在编码字节流之前完成的Unicode到Unicode转换,特别是在使用UTF-16时,正如另一个这样的问题所讨论的那样。
发布于 2009-08-05 12:38:59
看起来所有这些非编解码模块都是逐案处理的。到目前为止,我发现的是:
我猜这意味着没有标准的框架来创建这样的字符串/字节数组转换模块,但是它们是在Python 3中逐案完成的。
Python 3.2的更新
一个评论一篇博客文章“使用Python的unicode支持压缩文本”提醒我,这些编解码器已经返回Python3.2了。
引用以下评论:
但是,由于这些是“文本到文本”或“二进制到二进制”的转换,Python3.x中的encode()/decode()方法不支持这种用法--这是Python2.x的一个特性)。 编解码器本身是3.2版的,但是您需要通过编译码模块API来使用它们--它们不是通过object方法速记获得的。
看看-二进制变换。
来自巴里华沙的博客文章
您是否知道Python2为执行有趣的转换提供了一些编解码器,如Caeser旋转(即rot13)?因此,您可以这样做:编码(‘rot-13’) 'sbb‘ 但是,这在Python3中不起作用,因为即使仍然存在某些str到str编解码器(如rot-13 ),但str.encode()接口要求编解码器返回一个字节对象。为了在Python 2和Python 3中使用str到str编解码器,您必须打开外壳并使用较低级别的API,直接获取和调用编解码器: 从编码器导入>>>编码器= getencoder('rot-13') >>> rot13string =编码器(Mystring) 您必须从编码器的返回值中获取零元素,因为使用了codecs。有点难看,但是它在Python的两个版本中都能工作。
发布于 2009-08-05 13:01:21
您对行结束转换的具体需求是什么?如果只用于写入文件或文件对象,则可以指定与open()
一起使用的行结束格式,而\n
将在写入文件时自动转换为行结束格式。不可否认,这只适用于以文本形式打开的文件,而不是数据。(您还可以指定在将文本写入文件时使用的编码方式,这有时会很有用。)
http://docs.python.org/3.1/library/functions.html#open
要使用常规字符串进行转换,只需执行yourstring = yourstring.replace('\n', '\r\n')
将Linux样式转换为Windows样式,yourstring = yourstring.replace('\r\n', '\n')
用于从Windows风格转换为Linux样式。不过,你可能已经知道了,这可能不是你要找的东西。(实际上,如果您正在写入一个文本文件,那么无论如何,如果启用了通用换行符模式(这是默认的),它应该将\n
转换为\r\n
。
同样,如果您想在各种Unicode映射之间进行转换(假设您正在处理字节序列,因为Python内部使用的字符串实际上没有设置为任何特定类型的Unicode),那么只需使用bytes.decode()
或bytearray.decode()
解码字节序列,然后使用str.encode()
进行编码。将UTF-8改为UTF-16:
newstring = yourbytes.decode('utf-8')
yourbytes = newstring.encode('utf-16')
这样做时,换行符不能在两种Unicode格式之间正确转换,这不会有任何问题。
还有str.translate()
和str.maketrans()
,不过我不确定它们是否有用:
http://docs.python.org/3.1/library/stdtypes.html#str.translate
http://docs.python.org/3.1/library/stdtypes.html#str.maketrans
另外,可以这样实现rot_13:
import string
rot_13 = str.maketrans({x: chr((ord(x) - ord('A') + 13) % 26 + ord('A') if x.isupper() else ((ord(x) - ord('a') + 13) % 26 + ord('a'))) for x in string.ascii_letters})
# Using hard-coded values:
rot_13 = str.maketrans('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm')
无论哪种方式,使用S.translate(rot_13)
都会导致普通字符串变成rot_13
,而rot_13
字符串变成普通字符串。
https://stackoverflow.com/questions/1197589
复制相似问题