博客原文:http://python.iswbm.com/en/latest/c01/c01_44.html
Github:https://github.com/iswbm/PythonCodingTime
Python 中编码问题,一直是很多 Python 开发者的噩梦,尽管你是工作多年的 Python 开发者,也肯定会经常遇到令人神烦的编码问题,好不容易花了半天搞明白了。
一段时间后,又全都忘光光了,一脸懵逼的你又开始你找各种博客、帖子,从头搞清楚什么是编码?什么是 unicode?它和 ASCII 有什么区别?为什么 decode encode 老是报错?python2 里和 python3 的字符串类型怎么都不一样,怎么对应起来?如何检测编码格式?
反反复复,这个过程真是太痛苦了。
今天我把大家在 Python 上会遇到的一些编码问题都讲清楚了,以后你可以不用再 Google,收藏这篇文章就行。
1. Python 3 中 str 与 bytes
在 Python3中,字符串有两种类型 ,str 和 bytes。
今天就来说一说这二者的区别:
unicode string(str 类型)
:以 Unicode code points 形式存储,人类认识的形式
byte string(bytes 类型)
:以 byte 形式存储,机器认识的形式
在 Python 3 中你定义的所有字符串,都是 unicode string类型,使用 type
和 isinstance
可以判别
# python3 >>> str_obj = "你好" >>> >>> type(str_obj) <class 'str'> >>> >>> isinstance("你好", str) True >>> >>> isinstance("你好", bytes) False >>>
而 bytes 是一个二进制序列对象,你只要你在定义字符串时前面加一个 b
,就表示你要定义一个 bytes 类型的字符串对象。
# python3 >>> byte_obj = b"Hello World!" >>> type(byte_obj) <class 'bytes'> >>> >>> isinstance(byte_obj, str) False >>> >>> isinstance(byte_obj, bytes) True >>>
但是在定义中文字符串时,你就不能直接在前面加 b
了,而应该使用 encode
转一下。
>>> byte_obj=b"你好"<br> File "<stdin>", line 1<br>SyntaxError: bytes can only contain ASCII literal characters.<br>>>> <br>>>> str_obj="你好"<br>>>> <br>>>> str_obj.encode("utf-8")<br>b'\xe4\xbd\xa0\xe5\xa5\xbd'<br>>>> <br>
2. Python 2 中 str 与 unicode
而在 Python2 中,字符串的类型又与 Python3 不一样,需要仔细区分。
在 Python2 里,字符串也只有两种类型,unicode 和 str 。
只有 unicode object 和 非unicode object(其实应该叫 str object) 的区别:
unicode string(unicode类型)
:以 Unicode code points 形式存储,人类认识的形式byte string(str 类型)
:以 byte 形式存储,机器认识的形式
当我们直接使用双引号或单引号包含字符的方式来定义字符串时,就是 str 字符串对象,比如这样
# python2 >>> str_obj="你好" >>> >&g<i style="color:transparent">本文来源gaodai$ma#com搞$代*码6网</i>t;> type(str_obj) <type 'str'> >>> >>> str_obj '\xe4\xbd\xa0\xe5\xa5\xbd' >>> >>> isinstance(str_obj, bytes) True >>> isinstance(str_obj, str) True >>> isinstance(str_obj, unicode) False >>> >>> str is bytes True