16

我试图通过自己encodedecodePython 来理解,但对我来说没有什么是真正清楚的。

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

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

每个函数的输出是什么,它的编码是什么?每个函数中的“编码”参数有什么用?我不太了解“字节字符串”的定义。

我有一个重要的问题,有没有办法从一种编码传递到另一种编码?我在 ASN.1 上阅读了一些关于“八位字节字符串”的文本,所以我想知道它是否与“字节字符串”相同。

谢谢你的帮助。

4

4 回答 4

24

它在 Python 2 中稍微复杂一点(与 Python 3 相比),因为它将“字符串”和“字节字符串”的概念混为一谈,但请参阅每个软件开发人员绝对、肯定必须了解 Unicode 和字符集的绝对最小值. 从本质上讲,您需要了解的是,“字符串”和“字符”是计算机无法直接表示的抽象概念。字节串是直接来自磁盘的原始字节流(或者可以直接从磁盘写入)。encode从抽象到具体(你最好给它一个 unicode 字符串,它会给你一个字节字符串);decode反其道而行之。

编码规则是“a”应该用字节表示0x61,“α”应该用两字节序列表示0xc0\xb1

于 2012-07-21T23:42:16.993 回答
18

我在 PyCon、Pragmatic Unicode 或 How Do I Stop The Pain的演讲涵盖了所有这些细节。

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

于 2012-07-22T00:04:50.050 回答
6

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

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

此模型已针对 Python 3.x 进行了更改

  • 2.xunicode变成 3.x str(并且u前缀从文字中删除)。
  • 引入了一种bytes类型来表示二进制数据。

字符编码是 Unicode 字符串和字节字符串之间的映射。要将 Unicode 字符串转换为字节字符串,请使用以下encode方法:

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

要转换另一种方式,请使用以下decode方法:

>>> '\xE2\x82\xAC'.decode('UTF-8')
u'\u20ac'
于 2012-07-21T23:59:22.390 回答
4

是的,字节串是八位字节串。输入/输出文本(从/到控制台、文件、网络……)时发生编码和解码。您的控制台可能在内部使用 UTF-8,您的 Web 服务器提供 latin-1,并且某些文件格式需要奇怪的编码,例如 Bibtex 的重音符号:fran\c{c}aise. 您需要在输入/输出上从/到它们进行转换。

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

于 2012-07-21T23:42:03.330 回答