【问题标题】:I don't understand encode and decode in Python (2.7.3)我不懂 Python (2.7.3) 中的编码和解码
【发布时间】:2012-07-21 23:30:09
【问题描述】:

我试图在 Python 中自己理解 encodedecode,但对我来说没有什么是真正清楚的。

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

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

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

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

感谢您的帮助。

【问题讨论】:

  • 但是您确实阅读了docs,不是吗。对不起,我在问

标签: python string unicode decode encode


【解决方案1】:

它在 Python 2 中稍微复杂一些(与 Python 3 相比),因为它将“字符串”和“字节字符串”的概念混为一谈,但请参阅 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets。本质上,您需要了解的是,“字符串”和“字符”是计算机无法直接表示的抽象概念。字节串是直接来自磁盘的原始字节流(或者可以直接从磁盘写入)。 encode 从抽象到具体(你最好给它一个 unicode 字符串,它会给你一个字节字符串); decode 则相反。

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

【讨论】:

  • 如果我理解的话,一个字符串在解释器中没有真正的感觉,它不能在机器之间交换,所以当我写 str.encoding("ascii") 时,str 变成了真实的,它是根据内存中该示例中的ascii规范编码的,其编码值与ascii定义的相同,这种编码称为“字节串”:是吗??
  • “字节串”中的一个字节可以支持加法吗?
  • @NarcisseDoudieuSiewe 对于第一个问题,是的,没错,尽管您的术语有点混乱-“编码”是 ASCII,而不是最终的字节串-可能被称为“ascii-编码字符串”,例如。对于第二个问题,字节串的一个元素是一个元素的字节串(在 Py2 中,一个字节串就是str 类型,而一个字符串就是unicode 类型),所以b[0] + b[0] 进行连接。这在 Py3 中有所不同,其中字节串的一个元素实际上是 int,因此 b[0] + b[0] 会进行 int 加法。
  • :) 我想“字节串”和“字节串”不一样,因为在这个网页上:docs.python.org/library/codecs.html 在“7.8.3 标准编码”之后以及第一个和第二个编码之间表中明确提到“对于下面列出的编解码器,“编码”方向的结果总是一个字节串。”。感谢您对我所有问题的帮助
  • 我想知道一些事情,这个时候我使用python ctypes来制作一些wifi框架结构,并使用lorcon2我可以通过局域网发送它们。我想在字符串中转换这个结构以获得这个结构的十六进制表示。为此,我已经看到了两个实现此目的的功能。 ctypes.string_at 和 ctypes.wstring_at 函数。我知道 ctypes.wstring_at 用于制作 unicode 字符串,但 ctypes.string_at 用于 ???我们可以得到哪种字符串?一个ASCII字符串??还是十六进制字符串??
【解决方案2】:

我在 PyCon 的演示文稿Pragmatic Unicode, or, How Do I Stop The Pain 涵盖了所有这些细节。

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

【讨论】:

  • 这篇文章太棒了。不得不将其添加为书签以阅读几次。谢谢!
【解决方案3】:

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 前缀已从文字中删除)。
  • 引入了bytes 类型来表示二进制数据。

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

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

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-08-18
      • 2017-12-25
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      • 2020-01-30
      • 2013-05-15
      相关资源
      最近更新 更多