python3 和 python2 的编码与解码差别很大吗?

2017-02-25 00:41:47 +08:00
 woniu127
今天读取数据时,出现 decode error ,遂决定好好研究下 python decode 和 encode ,看了几篇 v2 大牛的帖子( https://www.v2ex.com/t/339142 ),自以为已经明白,编码( encode)是字符转为字节流,解码( decode )是字节流转为字符。

于是在 pycharm 试了试,又陷入了疑惑。。。(我用的 python3)

字符格式前加不加'u'都是 str 格式,另外感觉和 python2 的 decode , encode 正好是反的,是我学了假 python ,还是长了个假脑子。

具体看图吧(直接传我网站上了)

http://xiaoyanyou.com/?attach-download-30.htm

http://xiaoyanyou.com/?attach-download-31.htm
3165 次点击
所在节点    问与答
4 条回复
Sylv
2017-02-25 02:28:02 +08:00
Python 3 的 str 对应 Python 2 的 unicode ,本身可以说是没有编码,存储的是 Unicode 的码点。
Python 3 的 bytes 对应 Python 2 的 str ,是字节流,相同文字用不同编码生成的字节流是不一样的。
AvenirX
2017-02-25 05:40:59 +08:00
@Sylv 对的。补充一下: Python3 的 bytes 是 Python2 中 str 的子集。 参考 Text versus binary data 章节 https://docs.python.org/3/howto/pyporting.html


@woniu127 先理解 Text 和 Binary data (楼上说的文字和字节流): Text 是人看的,文本文件里面写的字符串是 Text 。 Binary data 是机器存的。保存文件 Text -encode-> Binary data ;打开 Binary data -decode-> Text 。


Python3 是一一对应:, str 对应 Text , bytes 对应 Binary data 。 str encode 成为 bytes , bytes decode 成为 str 。你附图里的操作很好的说明,“好”和 u “好”都是 str 。

Python2 中 bytes 对应 binary data (等同于 python3 的 bytes ),而 str 是 text 也可以是 binary data 。“好”和 u “好”不同, u “好”( unicode )才是真正的 str 。


a="好"(py2) 等价 a=b'\xe5\xa5\xbd'(py2) 等价 a=b'\xe5\xa5\xbd'(py3)。 type 为 bytes(py3),可被 decode 。

a=u"好"(py2) 等价 a="好"(py3) 等价 a=u"好"(py3)。 type 为 str(py3),可被 encode 。
Gandum
2017-02-25 08:04:21 +08:00
那么不如尝试一下这个问题:
在 Windows 下用 Winzip 压缩的 zip 包,其中包含中文的文件名,在 Linux 中被解压,产生的文件名乱码问题如何解决(分别用 Python2 和 Python3 )
woniu127
2017-02-25 09:53:04 +08:00
@AvenirX 谢谢解答,理解了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/343040

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX