2012-07-21 87 views
8

我试图自己理解Python中的encodedecode,但对我来说没有什么是真的很清楚。我不明白Python中的编码和解码(2.7.3)

  1. str.encode([encoding,[errors]])
  2. str.decode([encoding,[errors]])

首先,我不明白这两个函数的 “编码” 参数的需要。

每个函数的输出是什么,它的编码是什么?每个函数中“编码”参数的用法是什么?我真的不明白“字符串”的定义。

我有一个重要的问题,有没有办法从一种编码传递给另一种? 我在ASN.1上读过一些关于“octet string”的文字,所以我想知道它是否和“bytes string”一样。

感谢您的帮助。

+4

但您确实阅读过[docs](http://docs.python.org/library/stdtypes.html#str.encode),是不是。对不起,我要求 – tiwo 2012-07-21 23:36:24

回答

19

在Python 2中(与Python 3相比)它稍微复杂一些,因为它将'string'和'bytestring'的概念相当混淆,但请参阅The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets。从本质上讲,你需要理解的是,'字符串'和'字符'是不能直接由计算机表示的抽象概念。字节串是直接从磁盘读取的原始字节流(或者可以直接从磁盘写入)。 encode从抽象变为具体(你最好给它一个unicode字符串,并且它返回一个字节字符串); decode则相反。

编码是规定'a'应该由字节0x61表示,'α'由2字节序列0xc0\xb1表示。

+0

,如果我明白了,字符串没有真正的解释器,它不能在机器之间交换,所以当我编写str.encoding(“ascii”)时,str变成了真实,它是按照asciispécifications在内存中编码的,其编码值与ascii定义的相同,这种编码被称为“字节串”:它是正确的? – 2012-07-22 00:29:43

+0

可以在“字节串”中的一个字节支持添加吗? – 2012-07-22 00:39:58

+1

@NarcisseDoudieuSiewe对于第一个问题,是的,这是正确的,尽管您的术语有点混淆 - “编码”是ASCII,而不是最终的字符串 - 例如,可能被称为“ASCII编码的字符串”。对于第二个问题,一个字节串的一个元素是一个单元素字节串(在Py2中,一个字节串只是'str'类型,而一个字符串是'unicode'类型),所以'b [0] + b [0]'没有连接。这在Py3中是不同的,其中字节字符串的一个元素实际上是一个“int”,因此“b [0] + b [0]”不会被添加。 – lvc 2012-07-22 01:01:47

4

是的,一个字节串是一个八位组串。编码和解码在输入/输出文本(从控制台,文件,网络...发送到/时)时发生。您的控制台可能会在内部使用UTF-8,您的Web服务器会提供拉丁文-1,某些文件格式需要奇怪的编码,如Bibtex的口音:fran\c{c}aise。您需要在输入/输出上将它们转换为/。

{en|de}code方法做到这一点。它们通常在幕后调用(例如,print "hello world"将字符串编码为任何您的终端使用)。

6

的Python 2.x的有两种类型的串:

  • str = “字节串”=八位位组序列。这些用于“传统”字符编码(如windows-1252IBM437)和原始二进制数据(如struct.pack输出)。
  • unicode =“Unicode字符串”=一系列UTF-16UTF-32,具体取决于Python的构建方式。

这个型号changed for Python 3.x

  • 2.x的unicode成为3.X str(和u前缀从字面下降)。
  • A bytes类型是为了表示二进制数据而引入的。

A character encoding是Unicode字符串和字节字符串之间的映射。要转换一个Unicode字符串,一个字节串,使用encode方法:

>>> u'\u20AC'.encode('UTF-8') 
'\xe2\x82\xac' 

以其他方式转换,使用decode方法:

>>> '\xE2\x82\xAC'.decode('UTF-8') 
u'\u20ac' 
14

从PYCON我的演讲,Pragmatic Unicode, or, How Do I Stop The Pain涵盖了所有的这些细节。

简而言之,Unicode字符串是称为代码点的整数序列,而字节串是字节序列。编码是将Unicode代码点表示为一系列字节的一种方式。因此,unicode_string.encode(enc)将返回用“enc”编码的Unicode字符串的字节串,并且byte_string.decode(enc)将返回通过用“enc”解码字节串而创建的Unicode字符串。

+0

这篇文章太棒了。必须将其加入书签以多次阅读。谢谢! – 2016-12-20 12:13:04