python3 encode_在python3 encode和decode 的使用

说这个问题之前必须的介绍关于编码的在我们这的发展:

首先电脑能识别的最初的语言是二进制 ---010101这种

然后在是我们知道的ASSIC码

再过了就是 gb2312----------->gbk1.0--------->最后是gbk18030

最后国际上为了统一编制了 Unicode  但是Unicode有三个版本Unicode‘UTF——32’, 每个字符都是4个字节,一个字节8bety,但美国人民有点不愿意,随后

改编成了Unicode‘UTF——16’每个字符都是两个字节,最后改编成现在的Unicode“UTF-8”在这里面,英文用的ASSIC码一个字节(美国人民应该很高兴),然后欧洲的一些语言字符是两个字节,一个中文就是三个字节

介绍完历史,接下来就讲讲为么子要encode 和decode:最根本的原因还是各个编码只能上级包容下级,下级想读取上级就会出现乱码(简单的说就是Unicode能识别gbk,而gbk想直接Unicode就会乱码,Unicode是向下包容的)

在Python2里面(估计现在不怎么用的吧): 默认识别是ASCLL码,所以不能识别中文。而现在国内的windows默认支持识别应该是gbk

在python2中的中文想要Windows识别就得通过 声明“#!_*_ coding :UTF-8 _*_ ” 源码格式为UTF-8,这样就可以识别输入的中文,但是python2想要在window上表现出来就必须通过编码为gbk格式才行这里就可以这样:方法一(感觉这方法是个鸡肋,方法二靠谱些):(假定已经声明是UTF-8)                                                                                                                                                  s =‘中文巴拉巴拉 ’

s_to_Unicode=s.decode("Unicode")   将‘中文巴拉巴拉’转为Unicode格式 这时候 再将 ,                                                                                                       s_to_Unicode =s.encode('gbk')    这会儿window就能识别s了print就不会出错了这里要解释两点内容: 为什么要先解码再编码而不直接编码;还有假如encode 和decode后面不写格式会怎样(内容太多我画了个图)

s_to_Unicode=s.decode("Unicode")    但是由于Unicode是向下兼容gbk的所以这里的print(s_to_Unicode)也能被windows是被显示成和s_to_Unicode =s.encode('gbk')一样的中文,但是他们的内部排序和占的内存都不相同不同这里就不深究了;这里补充解释一下为何不见gbk直接解码成utf-8,原因是你省了一步解码 成Unicode的过程,但是电脑不会省,所以说如果直接解码为utf-8会报错 其内部默认的过程是将gbk格式先解码为python2默认的ASCLL码再编码为UTF-8这肯定会乱的撒

方法二:直接声明“#!_*_ coding :gbk _*_ ”:这样print(s)window就能识别了

在python3 里面 :python3的默认文件编码是UTF-8  但是(重点)所有的字符都是Unicode格式,所以 s =‘中文巴拉巴拉 ’  可以被windows识别,如果你非要编码为gbk格式 这里输出的将不会是 ‘中文巴拉巴拉 ’,因为在python3里面特殊字符(即中文)编码会将其转换为另一种格式即byte字节类型,而byte类型只能识别英文等非特殊字符,所以在s =‘ i love 中文巴拉巴拉 ’编码为gbk时就能print(s)出 i love 中文巴拉巴拉这里得到的byte类型是以gbk编码的byte类型,要转回Unicode就得解码gbk,与byte无关。python3在解码时会把byte类型转换成字符串

补充:byte类型相当于[0--255]之间的纯数字类型    在文件处理时:不同机器之间进行传输就必须用到这种类型

以下是我测试后的代码

1 a = 'hello 酷狗' #str类型》》》》Unicode

2

3 #编码 str >>>>>bytes

4 b = bytes(a,'utf8')5 print(b,type(b)) #b'hello \xe9\x85\xb7\xe7\x8b\x97'

6 b1 = bytes(a,'gbk')7 print(b1,type(b1)) #b'hello \xbf\xe1\xb9\xb7'

8

9 c = a.encode('utf8')10 print(c,type(c)) #b'hello \xe9\x85\xb7\xe7\x8b\x97'

11 c1 = a.encode('gbk')12 print(c1,type(c1)) b'hello \xbf\xe1\xb9\xb7'

13

14

15 #解码 bytes>>>>>str

16 d = str(b,'utf8')17 print(d,type(d)) #hello 酷狗

18 d1 = str(b,'gbk')19 print(d1,type(d1)) #hello 閰风嫍

20

21 d2 = str(b1,'gbk')22 print(d2,type(d1)) #hello 酷狗

23

24 e = b.decode('utf8')25 print(e,type(e)) #hello 酷狗

26 e2 = b1.decode('gbk')27 print(e2,type(e2)) #hello 酷狗

View Code

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值