python基础一:编码和解码

本文详细介绍了Python2和Python3中字符编码和解码的区别,包括默认编码、Unicode、UTF-8、GBK等编码方式。重点讨论了Unicode作为万国码的角色,以及如何在不同编码间进行转换。同时,强调了编码和解码在存储与传输过程中的重要性,以及避免乱码问题的方法。
摘要由CSDN通过智能技术生成

编码和解码

  1. python2的解释器加载py文件时会对文件内容编码放到内存中,默认用ascii编码
  2. python2中的代码存储在硬盘上是ascii编码
  3. python3代码在内存中运行时是unicode编码
  4. python3中代码存储在硬盘是utf8编码
  5. python2在编译器安装时,可以通过参数 –-enable-unicode=ucs2 或 –enable-unicode=ucs4分别用于指定两个字节、四个字节表示一个unicode(unicode16/unicode32)
  6. python3中无法选择,默认用usc4
  7. 查看当前python中表示unicode字符串时占用的空间:
    Import sys
    Print(sys.maxunicode)
# 如果是65535,表示ucs2标准
# 如果是1114111,表示ucs4标准
  1. 字符编码(密码本):字符和数字(0/1)的对应关系。比如字符h存在计算机硬盘是byte00001002。
  2. 编码:字符串转换成bit
  3. 解码:bit或16进制转成字符串
  4. ASCII编码:是一个字节表示一个字符;只有英文字符和特殊符号共计128个字符,所以只用了8bit的七位,所以ascii码的8bit中最高位是0;之后出现的编码方式必须兼容ascii码因为计算机底层的ascii码
  5. gb2132编码和GBK(ANSI)编码(都用2个字符表示一个字符):中国的北大方正用16bit编码中文字符,最开始编了几千个字符叫gb2132编码,后来又扩充到六万多个中文字符叫GBK(ANSI)编码。但中文字符有九万多个。
    GBK包含中文日文韩文,还兼容ascii码中的英文,兼容的方式是在原本八位ascii码前补八位0
  6. 万国码unicode:可编码所有国家的文字,有16bit表示一个字符和32bit表示一个字符两种unicode。他是固定长度的,所以浪费空间,无法实现,所以只是理论
  7. utf-8:是unicode的实现:可变长度的unicode,英文占用一字节;欧洲文字俩字节;中文三字节
  8. utf-8 16 32: 表示一个字符最小用几位表示
  9. GBK和utf8不能互相转换,因为gbk中中文占俩字节,而utf8中占三字节
    因为unicode是万国码,所以任何编码方式都可以和unicode相互转换;但其他编码方式之间不能直接转换,要通过unicode转换
  10. 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'
========================
看看 看看
  1. 为什么要编码:把unicode转换成utf8的编码,为了节省空间,不管是存储还是网络传输都要用utf8的编码
str1=“看看”#unicode
abc=str1.encode(“UTF-8”) #encode之后是bytes类型,依然是原字符串
print(abc)
b’\xe1\x22\xt3\x34\x78\x43’ #x表示十六进制,一个中文在utf8下是三个字节
  1. 解码:将bytes数据解码为有意义的字符串
abc=b’\xe5\x88\xt3\x34\x78\x43’ 
str1=abc.decode(‘UTF-8’) #str1是unicode
python3代码中的字符串都是unicode
bytes是字符串的另一种表现形式
  1. python2和python3都适用的编码知识:
(1)	各个编码的二进制是不能互相识别的,会产生乱码(就是用utf8编码的二进制byte不能被gbk解码为str,必须还用utf8解码为str)
(2)	文件在硬盘中存储或在网络中传输可以使用ascii,utf8,gbk编码等;但不能用unicode编码因为unicode是任何字符都是固定长度(16位或32位)浪费资源
  1. 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#$'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值