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"你好"
File "<stdin>", line 1
SyntaxError: bytes can only contain ASCII literal characters.
>>> str_obj="你好"
>>> str_obj.encode("utf-8")
b'\\xe4\\xbd\\xa0\\xe5\\xa5\\xbd'
2. Python 2 中 str 与 unicode
在Python2里,字符串也只有两种类型,unicode和str。
- unicode string(unicode类型):以Unicode code points形式存储,人类认识的形式
- byte string(str 类型):以byte形式存储,机器认识的形式
当我们直接使用双引号或单引号包含字符的方式来定义字符串时,就是 str 字符串对象
# python2
>>> str_obj="你好"
>>> type(str_obj)
<type 'str'>
>>> isinstance(str_obj, bytes)
True
>>> isinstance(str_obj, str)
True
而当我们在双引号或单引号前面加个u,就表明我们定义的是 unicode 字符串对象
# python2
>>> unicode_obj = u"你好"
>>> type(unicode_obj)
<type 'unicode'>
>>> isinstance(unicode_obj, bytes)
False
>>> isinstance(unicode_obj, str)
False
3. 如何检测对象的编码
所有的字符,在 unicode 字符集中都有对应的编码值。
把这些编码值按照一定的规则保存成二进制字节码,就是我们说的编码方式,常见的有:UTF-8,GB2312 等。
4. 编码与解码的区别
编码和解码,其实就是str与bytes的相互转化的过程,我们这里只说python3的
- 编码 :encode方法,把字符串对象转化为二进制字节序列
- 解码 :decode方法,把二进制字节序列转化为字符串对象
5. 如何设置文件编码
在Python 2中,默认使用的是 ASCII 编码来读取的,因此,我们在使用Python 2的时候,如果你的python文件里有中文,运行是会报错的。
而在 Python 3 中,默认使用的是 uft-8 来读取,所以省了不少的事。
对于这个问题,通常解决方法有两种:
第一种方法
在 python2 中,可以在文件头部指定编译器读取源码时采取的编码和解码方式
# -*- coding: utf-8 -*-
# coding:utf-8
# coding=utf-8
以上三种书写方式,任选一种即可
第二种方法
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
这里在调用sys.setdefaultencoding(‘utf-8’) 设置默认的解码方式之前,执行了reload(sys),这是必须的,因为python在加载完sys之后,会删除 sys.setdefaultencoding 这个方法,我们需要重新载入sys,才能调用 sys.setdefaultencoding 这个方法。
完结撒花,有疑问留言探讨哈~~~