Python 编码encode()、 解码decode()问题

乱码这种东西,时不时出现。原本开开心心想着我要学习啦,而后兴高采烈打开了比火星文还火星文的字符…… python

没事,我能够搞定这堆鬼画符。 程序员

先来说一下为何有乱码这种东西的存在面试

故事是这样滴:学习

字符串是Python的一种数据类型,它的处理会涉及到编码问题。网站

咱们可爱的计算机只能识别计算机语言,它以二进制字节形式来存储数据,就是0和1构成的一个长长的二进制字节(通常人是识别不了这种这么原始的语言的)编码

而做为人类,咱们说的是人话,'language'、'中文'、'123'……,用的是文本字符(计算机读不懂这种抽象语言)翻译

So, 人类创造出了ASCII码,一种字符对照表(相似翻译官),让人类跟计算机能交流啦!code

最先的对照表是ASCII码表,ASCII码表是美国人创造出来的,总共128个字符,知足美国人民的平常需求!blog

可是!!!utf-8

世界那么大,每一个国家都有本身的文字、符号,人类一直在扩充这张对照表,陆续创造了:扩展ASCII码、GB23十二、GBK……

啊哈哈,各个国家有各个国家的特点。因而,生产出了许许多多的对照表。

工做中常常会遇到不一样编码的问题,须要咱们对不一样的编码进行转换……可是随着人们的扩充,选到合适的对照表愈来愈费时间、精力,大家谁才是我要的那张表?

你可知道,时间是宝贵的,更况且是程序员的时间。

终于,美国一个叫ISO的组织看不下去了,它决定整顿一下这个混乱的编码世界

因而,Unicode就诞生啦,它将全世界人民的符号所有编进去了。让大家所有有个规范走,别再搞事情啦!(快去这个神器的网站看看:https://unicode-table.com/en/)

在Python里,若是大家要转换编码,都要通过Unicode。

不管是UTF-8或者是GBK,整个过程都是先经过编码decode转换为Unicode告诉Unicode当前的编码格式是什么、而后再经过解码encode转换为本身想要实现的编码格式或类型。

假设一个只会中文和一个只会英文的外交官在交流,Unicode就扮演其中的翻译官,他将中文字符转换成Unicode字节,再将Unicode字节转换成英文字符。

Python3中,str类型存unicode数据,bytse类型存bytes数据。

And, 文件默认的编码方式就是utf-8。

下面给个图来加深一下记忆:

下面到举栗子时间:

a = '我爱排球,有人要打球吗?'
print(type(a))
<class 'str'>
a.encode()
b'\xe6\x88\x91\xe7\x88\xb1\xe6\x8e\x92\xe7\x90\x83\xef\xbc\x8c\xe6\x9c\x89\xe4\xba\xba\xe8\xa6\x81\xe6\x89\x93\xe7\x90\x83\xe5\x90\x97\xef\xbc\x9f'

上面的是用默认的UTF-8去encode变量a,下面试一下encode为GBK类型

a.encode('GBK')
b'\xce\xd2\xb0\xae\xc5\xc5\xc7\xf2\xa3\xac\xd3\xd0\xc8\xcb\xd2\xaa\xb4\xf2\xc7\xf2\xc2\xf0\xa3\xbf'

上面展现了编码过程,接下来展现解码操做,解码常常出错,因此要留心哦

b = '下午四点全队集合,东区气排场' 
print(type(b))
b1 = b.encode()
b2 = b.encode('GBK')
<class 'str'>
print(type(b1))
print(type(b2))
<class 'bytes'>
<class 'bytes'>

先把b以两种编码形式编好,一个是b1(UTF-8编码的),另外一个是b2(GBK编码的)

用谁编码的,就只能用谁去解码,否则会报错

下面,咱们不这么干,先来个乱码状况:

b1是UTF-8编码的,可是咱们用GBK去解码

b1.decode('GBK')
'涓嬪崍鍥涚偣鍏ㄩ槦闆嗗悎锛屼笢鍖烘皵鎺掑満'

啊哈哈,你看出上面输出的是什么吗,反正我看不出

这就是常见的乱码状况。

下面是时候正常解码一下啦!

b1.decode('UTF-8')
'下午四点全队集合,东区气排场'

So,乱码就是这么一回事,他只是缺乏一个对的翻译官。你要作的就是帮他找一个正确的翻译官。兄弟,加油,你是个称职的媒婆,你能够的

好了,我要去找吃的了。吃,吃,吃 ,我要胖十斤

相关文章
相关标签/搜索