pyhton编码解码理解

先放学习链接,看了这几篇博客,感觉还是有收获的:

https://www.cnblogs.com/linjiqin/p/3674825.html

https://blog.csdn.net/can0227/article/details/83240705

https://blog.csdn.net/liuchunming033/article/details/52223612

 

编码解码是怎么一回事,到底是怎么变来变去的?

Python 里面的编码和解码也就是 unicode 和 str 这两种形式的相互转化。

而str形式呢,就是字符串形式,它都是以一定的编码格式存在的。常见的编码格式有utf-8、ASCII、gb2312等等,由此可见,肉眼见到的 str 形式一般是看不出来什么编码的哦。

unicode 感觉就单纯很多了,他就是unicode

所以: 编码就是 unicode -> str,解码就是 str -> unicode,先大体有这么个概念吧。

 

具体语法是怎么写呢?

不同编码格式的字符串之间相互转换编码格式的话,都要先解码成unicode再编码成其他编码格式的字符串 如果直接将 str encode的话他会先按照默认的编码方式解码再编码

如str1是gb2312编码的,将str1转成utf-8编码的字符串,需要这么做:  str1.decode(‘gb2312’).encode(‘utf-8’)。

sys.defaultencoding指明了默认的字符串解码方式。即在解码时没有明确指明解码方式的时候使用。比如字符串默认的解码方式为“utf-8”, str1是gb2312 编码的, str2是utf-8编码的,那么对于str1.decode() 和 str2.decode(), str2就能解码成功,但是str1不可以。

 

练习:

#! /usr/bin/env python 
# -*- coding: utf-8 -*- 
s = '中文'  # 这里的 s 是utf-8编码的字符串类型
s.encode('gb18030') 

上面一段代码第二行就指明了该py文件里面的字符串默认编码格式是utf-8的,所以s这个字符串就是utf-8编码的字符串。

第4句代码将 s 重新编码为 gb18030 的格式,即进行 unicode -> str 的转换。因为s本身就是 str 类型的,因此 Python 会自动的先将 s 解码为 unicode,然后再编码成 gb18030。 

而当对s进行解码的时候,我们没有指明解码方式,python 就会使用 sys.defaultencoding 指明的方式来解码。很多情况下 sys.defaultencoding 是ANSCII,如果 s 不是这个类型就会出错。

⚠️注意:从这里我才意识到 原来第二行声明的:coding:utf-8 和 sys.defaultencoding 并不是一样的呢!!!coding 指的应该是字符串的编码, 而sys那个指的是解码的时候默认给你选择的类型,只有两个一样时才会成功,不一样就 GG 啦!

有两种办法改正:

1. 现将 s 指明解码方式解码后再编码。s.decode('utf-8').encode('gb18030')

2. 改变默认编码方式后再编码,加上 sys.setdefaultencoding('utf-8')后, 再运行 s.encode('gb2312')便可以成功

 

延伸1:

python2 中字符串的默认编码为 ASCII , python3中字符串的默认编码为 unicode

python2 默认解码为ASCII, python3中默认解码为 utf-8

所以在python3中字符串就是unicode了,直接编码就可以了。至于在终端下为什么不会直接展示字符,而是展示类似于 b'\xb9\xfe\xb9\xfe', 那就和你的电脑本身的编码有关了。

在终端下输入 locale , 我的电脑显示 LANG="zh_CN.UTF-8" ,说明我的电脑展示就是用的 utf-8 编码,所以不能正常展示 gb2312 的编码

延伸2:

str典型编码类型:gbk,utf8; 表现形式:\xc4\xe3\xba\xc3。

而看到类似于\u4f60,就需要明白,这个是中文的unicode编码或者说是unicode表示,未经具体的utf8或gbk编码 。

 

posted on 2019-07-25 14:21  mlllily  阅读(215)  评论(1编辑  收藏  举报