python中编码(encode)解码(decode)讲解⼀、python3中str与unicode
在python3中,字符串有两种形式:str和bytes,两者区别如下:
unicode string(str类型):以Unicode code points形式存储(⼈认识的形式)
byte string(bytes类型):以byte形式存储(机器认识的形式)
在python3中所定义的所有字符串都是unicode string类型,使⽤type和isinstance可以判别
⽽bytes是⼀个⼆进制序列对象,你只要你在定义字符串时前⾯加⼀个b,就表⽰你要定义⼀个bytes类型的字符串对象
但是在定义中⽂字符串时,你就不能直接在前⾯加b了,⽽应该使⽤encode转⼀下
⼆、python2中str与unicode
⽽在Python2中,字符串的类型⼜与Python3不⼀样,需要仔细区分
在Python2⾥,字符串也只有两种类型,unicode和str
只有unicode object和⾮unicode object(其实应该叫str object)的区别:
unicode string(unicode类型):以Unicode code points形式存储(⼈认识的形式)
byte string(str类型):以byte形式存储(机器认识的形式)
⽽当我们在双引号或单引号前⾯加个u,就表明我们定义的是unicode字符串对象,⽐如这样
三、如何检测对象的编码
所有的字符,在unicode字符集中都有对应的编码值(code point)
⽽把这些编码值按照⼀定的规则保存成⼆进制字节码,就是我们说的编码⽅式,常见的有:UTF-8,GB2312等。
也就是说,当我们要将内存中的字符串持久化到硬盘中的时候,都要指定编码⽅法,⽽反过来,读取的时候,也要指定正确的编码⽅法(这个过程叫解码),不然会出现乱码。
那问题就来了,当我们知道了其对应的编码⽅法,我们就可以正常解码,但并不是所有时候我们都能
知道应该⽤什么编码⽅式去解码?
这时候就要介绍到⼀个python的库--chardet,使⽤它之前需要先安装
python3 -m pip install chardet
chardet有⼀个detect⽅法,可以预测其编码格式
>>> import chardet
>>> chardet.detect(':Python编程时光'.encode('gbk'))
{'encoding': 'GB2312','confidence': 0.99,'language': 'Chinese'}
为什么说是预测呢,通过上⾯的输出来看,你会看到有⼀个confidence字段,其表⽰预测的可信度,或者说成功率。
但是使⽤它时,若你的字符数较少,就有可能“误诊”),⽐如只有中⽂两个字,就像下⾯这样,我们是使⽤gbk编码的,使⽤chardet却
识别成KOI8-R编码。
所以为了编码诊断的准确,要尽量使⽤⾜够多的字符
四、编码与解码的区别
编码和解码,其实就是str与bytes的相互转化的过程(Python 2已经远去,这⾥以及后⾯都只⽤Python 3举例)
编码:encode⽅法,把字符串对象转化为⼆进制字节序列
解码:decode⽅法,把⼆进制字节序列转化为字符串对象
Unicode & Character Encodings in Python
那么假如我们真知道了其编码格式,如何来转成unicode呢?
有两种⽅法:
第⼀种是直接使⽤decode⽅法
>>> byte_obj.decode('gbk')
'中⽂'
>>>
第⼆种是使⽤str类来转
>>> str_obj=str(byte_obj,encoding='gbk')
>>>str_obj
'中⽂'
>>>
五、如何设置⽂件编码
在Python 2中,默认使⽤的是ASCII编码来读取的,因此,我们在使⽤Python 2的时候,如果你的python⽂件⾥有中⽂,运⾏是会报错的。
SyntaxError:Non-ASCII character '\xe4' in file demo.py
原因就是ASCII编码表太⼩,⽆法解释中⽂。
⽽在Python 3中,默认使⽤的是uft-8来读取,所以省了不少的事。
对于这个问题,通常解决⽅法有两种:
第⼀种⽅法:在python2中,可以使⽤在头部指定
可以这样写,虽然很好看
# -*- coding: utf-8 -*-
但这样写太⿇烦了,我通常使⽤下⾯两种写法
#coding:utf-8
#coding=utf-8
第⼆种⽅法:
中文字符unicode查询import sys
reload(sys)
sys.setdefaultencoding('utf-8')
这⾥在调⽤sys.setdefaultencoding(‘utf-8’)设置默认的解码⽅式之前,执⾏了reload(sys),这是必须的,因为python在加载完sys之后,会删除sys.setdefaultencoding这个⽅法,我们需要重新载⼊sys,才能调⽤sys.setdefaultencoding这个⽅法
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论