编码和解码
- python2的解释器加载py文件时会对文件内容编码放到内存中,默认用ascii编码
- python2中的代码存储在硬盘上是ascii编码
- python3代码在内存中运行时是unicode编码
- python3中代码存储在硬盘是utf8编码
- python2在编译器安装时,可以通过参数 –-enable-unicode=ucs2 或 –enable-unicode=ucs4分别用于指定两个字节、四个字节表示一个unicode(unicode16/unicode32)
- python3中无法选择,默认用usc4
- 查看当前python中表示unicode字符串时占用的空间:
Import sys
Print(sys.maxunicode)
- 字符编码(密码本):字符和数字(0/1)的对应关系。比如字符h存在计算机硬盘是byte00001002。
- 编码:字符串转换成bit
- 解码:bit或16进制转成字符串
- ASCII编码:是一个字节表示一个字符;只有英文字符和特殊符号共计128个字符,所以只用了8bit的七位,所以ascii码的8bit中最高位是0;之后出现的编码方式必须兼容ascii码因为计算机底层的ascii码
- gb2132编码和GBK(ANSI)编码(都用2个字符表示一个字符):中国的北大方正用16bit编码中文字符,最开始编了几千个字符叫gb2132编码,后来又扩充到六万多个中文字符叫GBK(ANSI)编码。但中文字符有九万多个。
GBK包含中文日文韩文,还兼容ascii码中的英文,兼容的方式是在原本八位ascii码前补八位0 - 万国码unicode:可编码所有国家的文字,有16bit表示一个字符和32bit表示一个字符两种unicode。他是固定长度的,所以浪费空间,无法实现,所以只是理论
- utf-8:是unicode的实现:可变长度的unicode,英文占用一字节;欧洲文字俩字节;中文三字节
- utf-8 16 32: 表示一个字符最小用几位表示
- GBK和utf8不能互相转换,因为gbk中中文占俩字节,而utf8中占三字节
因为unicode是万国码,所以任何编码方式都可以和unicode相互转换;但其他编码方式之间不能直接转换,要通过unicode转换 - unicode的字符串转其他编码方式的字节
unicode的字符串可以用encode转换为各自编码方式的字节
各个编码方式的字节可以用decode转换为unicode的字符串
unicode_str='看看'
gbk_byte = unicode_str.encode('gbk')
utf8_byte = unicode_str.encode('utf-8')
print('utf8字节:',utf8_byte)
print('gbk字节:',gbk_byte)
print('========================')
str1 = utf8_byte.decode('utf-8')
str2 = gbk_byte.decode('gbk')
print(str1,str2)
结果:
utf8字节: b'\xe7\x9c\x8b\xe7\x9c\x8b'
gbk字节: b'\xbf\xb4\xbf\xb4'
========================
看看 看看
- 为什么要编码:把unicode转换成utf8的编码,为了节省空间,不管是存储还是网络传输都要用utf8的编码
str1=“看看”
abc=str1.encode(“UTF-8”)
print(abc)
b’\xe1\x22\xt3\x34\x78\x43’
- 解码:将bytes数据解码为有意义的字符串
abc=b’\xe5\x88\xt3\x34\x78\x43’
str1=abc.decode(‘UTF-8’)
python3代码中的字符串都是unicode
bytes是字符串的另一种表现形式
- python2和python3都适用的编码知识:
(1) 各个编码的二进制是不能互相识别的,会产生乱码(就是用utf8编码的二进制byte不能被gbk解码为str,必须还用utf8解码为str)
(2) 文件在硬盘中存储或在网络中传输可以使用ascii,utf8,gbk编码等;但不能用unicode编码因为unicode是任何字符都是固定长度(16位或32位)浪费资源
- python3的编码:(将str转换成bytes类型)
(1) 字符串在内存中是用unicode编码的
(2) bytes数据类型:和str很像,str有的方法,bytes都有,bytes数据类型的数据是用utf8或gbk或gb2312或ascii编码的但不能用unicode编码,bytes和str的区别就是编码方式不同
(3) str的编码方式是unicode,str要想存储或传输必须用utf8或gbk或gb2312或ascii编码方式编码成bytes
(4) 对于英文:
Str:的表现形式 s=‘Alex’;编码方式是unicode
Bytes:的表现形式是 s=b’Alex’;编码方式是非unicode
(5) 对于中文:
Str:的表现形式 s=‘中国’;编码方式是unicode
bytes的表现形式是 s=b’\xac\x02\x10\xab\xad\x35’;编码方式是非unicode因为三个字节表示的一个中文字符
(6) 编码函数:str.encode(‘utf-8’)
编码的实质是将unicode转换为gbk,utf8等
编码的表现形式是str类型转为bytes类型
str1 = '看看'
b1 = str1.encode(encoding='utf-32')
print(str1,b1)
print(type(b1))
C:\Python3\python3.exe F:/FW/test.py
看看 b'\xff\xff\x00\x00\x0bw\x00\x00\xefQ\x00\x00'
<class 'bytes'>
Process finished with exit code 0
b2 = b'\xff\xfe\x00\x00\x0bw\x00\x00\xefQ\x00\x00'
print(b2,type(b2))
str1 = b2.decode('utf-32')
print(str1,type(str1))
C:\Python3\python3.exe F:/FW/test.py
b'\xff\xff\x00\x00\x0bw\x00\x00\xefQ\x00\x00' <class 'bytes'>
看看 <class 'str'>
Process finished with exit code 0
另一种编码解码方式:
>>> bytes(str1,'utf-8')
b'\xff\xff\xb7\xe5\x87\xaf2234dd#$'
>>> str(byte1,'utf-8')
'看看2234dd#$'