*编码的发展进程
最初,大家使用的字符串编码是ASCII编码。但是它只对10个数字,26个大小写英文字母,以及一些特殊字符,共计256个,每个字符占一个字节。为了兼容各个国家的一些文字,出现了GBK,GB2312,UTF-8编码等。
其中GBK,GB2312是我国制定的中文编码标准,并规定一个英文字母字符占1字节,中文字符占2字节。
UTF-8则是国际通用的编码格式,它包含了全世界所有国家需要用到的字符,但是规定则是一个英文字母在1字节,中文占3字节。
注意:
Python 3.x以上版本默认采用的是UTF-8的编码格式,好处就是有效的解决了中文乱码的问题,不用单独去编码啦。
在python中,有两种常见的字符串类型,str 和 bytes类型。其中,str是用来表示Unicode字符,bytes用来表示二进制数据。str类型于bytes类型之间转换,就要用到encod() (str 转 bytes),decode() (bytes 转 str)。
encode() 方法
encode() 是字符串类型(str)提供的方法,用于将str类型转换成bytes类型,这个过程也称为“编码”。
语法格式:
str.encode([encoding = 'utf-8',[errors = 'strict'])
注意:[]中括号里面的一般为可选参数,如果不人为传参,则用括号里面的默认参数。各参数表如下
| 参数 | 含义 |
|---|---|
| str | 表示要进行转换的字符串 |
| encoding = ‘utf-8’ | 指定进行采用的编码,该选择默认采用。例如,如果想使用简体中文,可以设置bg2312。当方法中只使用第一个参数时,可以省略前面的"encoding=",直接写编码格式,如:str.encode(“UTF-8”) |
| errors = ‘strict’ | 指定错误处理方式,可选值有:1.strict:遇到非法字符抛出异常;2.ignore:忽略非法字符;3.replace:用"?"代替非法字符;4.xmlcharrefreplace:使用xml的字符引用;该参数默认值为strct |
注意:使用encode()方法对原字符进行编码时,不会直接修改原字符串,如果需要修改原字符串,需要重新赋值
【例1】
str = "python 真有趣儿"
str.encode()
b'python \xe7\x9c\x9f\xe6\x9c\x89\xe8\xb6\xa3\xe5\x84\xbf'
默认采用UTF-8,也可以手动指定其他编码格式,例如:
str.encode('gbk')
b'python \xd5\xe6\xd3\xd0\xc8\xa4\xb6\xf9'
decode()方法
和encode()方法正好相反,decode()方法用于将bytes类型的二进制数据转换为str类型,这个过程也称为”解码“
语法格式:
bytes.decode([encoding = "utf-8)"],[errors = "strict"])
表2 decode()参数及含义
| 参数 | 含义 |
|---|---|
| bytes | 表示要进行转换的二进制数据 |
| encoding = “utf-8” | 指定解码采用的字符编码,默认采用utf-8格式。当方法中只使用这一参数时,可省略"encoding=",直接写编码方式即可。注意,对bytes类型解码时,要选择和当初编码时一样的格式 |
| errors = “strict” | 指定错误处理方式,可选值是:1.strct:抛出异常;2.ingore:忽略非法字符;3.replace:用”?“替换非法字符;3.xmlcharrefreplace:使用xml的字符引用。该参数的默认值为:strict |
例1
str
'python 真有趣儿'
demo_bytes = str.encode()
demo_bytes.decode()
'python 真有趣儿'
注意:如果编码时采用编码格式不是默认的 UTF-8 ,那解码时就要选择与编码一致的编码,否则抛出异常,例如:
str = "RockNRoll 永远年轻!"
bytes = str.encode('gbk')
bytes
b'RockNRoll \xd3\xc0\xd4\xb6\xc4\xea\xc7\xe1\xa3\xa1'
bytes.decode()
Traceback (most recent call last):
File "<input>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd3 in position 10: invalid continuation byte
bytes.decode("GBK")
'RockNRoll 永远年轻!'
有趣的是,如果用默认的utf-8编码,用gbk解码的话,不一定会报错,也有可能会乱码,例3:
str = "RockNRoll 永远年轻" #乱码
bytess = str.encode()
bytess.decode("GBK")
'RockNRoll 姘歌繙骞磋交'
bytess.decode("gbk")
'RockNRoll 姘歌繙骞磋交'
bytess.decode(encoding = 'gbk',errors = 'strict')
'RockNRoll 姘歌繙骞磋交'
在以上"RockNRoll 永远年轻!”加个中文字符的“!”感叹号则会报错抛出异常,而英文字符"!"则不会,
a
'RockNRoll 姘歌繙骞磋交!'
str = "RockNRoll 永远年轻!!"
... bytess = str.encode()
... a =bytess.decode("GBK")
...
Traceback (most recent call last):
File "<input>", line 3, in <module>
UnicodeDecodeError: 'gbk' codec can't decode byte 0x81 in position 25: incomplete multibyte sequence
所以,如果解码和编码不一致的话,会出现意想不到的情况,报错抛出异常or 乱码,切记哦

8745




被折叠的 条评论
为什么被折叠?



