彻底搞懂Python编码,解码 encode decode

	对于很多人来说,python的中字符转码是一件很头疼的事情,本来期望结果输出的是中文,结果来一段像这样\xe4\xbd\xa0\xe5\xa5\xbd像是乱码的字符串。

encode()和decode()都是字符串的函数,可直接查看关于python字符串章节的官方文档:

https://docs.python.org/3/library/stdtypes.html?highlight=encode#string-methods

从英文意思上看,encode和decode分别指编码和解码。在python中,Unicode类型是作为编码的基础类型,即:

从英文意思上看,encode和decode分别指编码和解码。在python中,Unicode类型是作为编码的基础类型,即:

      decode                 encode
str ---------> str(Unicode) ---------> str
>>> u = '中文'                 # 指定字符串类型对象u 

>>> str1 = u.encode('gb2312')  # 以gb2312编码对u进行编码,获得bytes类型对象
>>> print(str1)
b'\xd6\xd0\xce\xc4'

>>> str2 = u.encode('gbk')     # 以gbk编码对u进行编码,获得bytes类型对象
>>> print(str2)
b'\xd6\xd0\xce\xc4'
>>> str3 = u.encode('utf-8')   # 以utf-8编码对u进行编码,获得bytes类型对象
>>> print(str3)
b'\xe4\xb8\xad\xe6\x96\x87'

>>> u1 = str1.decode('gb2312') # 以gb2312编码对字符串str进行解码,获得字符串类型对象
>>> print('u1')
'中文'

>>> u2 = str1.decode('utf-8')  # 报错,因为str1是gb2312编码的
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 0: invalid continuation byte

简要说下一般有哪些编码格式。

ASCII码

ASCII码是美国早期制定的编码规范,只能表示128个字符,包括英文字符、阿拉伯数字、西文字符以及32个控制字符。简单来说,就是下面这个表:
彻底搞懂Python编码,解码 encode decode_第1张图片

扩展ASCII码(Extended ASCII)

简单而言,扩展ASCII码的出现是因为ASCII不够用,所以向ASCII表继续扩充到256个符号。
但是因为对于扩展ASCII,不同的国家有不同的标准,于是促使了Unicode编码的诞生。
扩展ASCII码表如下:

彻底搞懂Python编码,解码 encode decode_第2张图片

Unicode

准确来说,Unicode不是编码格式,而是字符集。这个字符集包含了世界上目前所有的符号。
另外,在原来有些字符可以用一个字节即8位来表示的,在Unicode将所有字符的长度全部统一为16位,因此字符是定长的。
Unicode是长这样的:

\u4f60\u597d\u4e2d\u56fd\uff01\u0068\u0065\u006c\u006c\u006f\uff0c\u0031\u0032\u0033

上面这段Unicode的意思是“你好中国!hello,123”。

关于Unicode,可在这个网站查到所有字符:
https://unicode-table.com/en/

彻底搞懂Python编码,解码 encode decode_第3张图片

GB2312

当国人得到计算机后,那就要对汉字进行编码。在ASCII码表的基础上,小于127的字符意义与原来相同;而将两个大于127的字节连在一起,来表示汉字,前一个字节从0xA1(161)到0xF7(247)共87个字节,称为高字节,后一个字节从0xA1(161)到0xFE(254)共94个字节,称为低字节,两者可组合出约8000种组合,用来表示6763个简体汉字、数学符号、罗马字母、日文字等。
在重新编码的数字、标点、字母是两字节长的编码,这些称为“全角”字符;而原来在ASCII码表的127以下的称为“半角”字符。
简单而言,GB2312就是在ASCII基础上的简体汉字扩展。

gb2312码表:

http://www.fileformat.info/info/charset/GB2312/list.htm

GBK

简单而言,GBK是对GB2312的进一步扩展(K是汉语拼音kuo zhan(扩展)中“扩”字的声母),
收录了21886个汉字和符号,完全兼容GB2312。

GB18030

GB18030收录了70244个汉字和字符,更加全面,与 GB 2312-1980 和 GBK 兼容。
GB18030支持少数民族的汉字,也包含了繁体汉字和日韩汉字。
其编码是单、双、四字节变长编码的。

UTF(UCS Transfer Format)

	UTF是在互联网上使用最广的一种Unicode的实现方式。我们最常用的是UTF-8,表示每次8个位传输数据,除此之外还有UTF-16。

UTF-8长这样,“你好中国!hello,123”:

你好中国!hello,123

python的open()函数中encoding参数的问题

最近在用python打开文本文件进行词频统计时遇到一个问题

txt = open("threekingdoms.txt", "r", encoding ='utf-8').read()

运行后会出现UnicodeDecodeError异常

原因是在记事本编写的文本保存的默认类型都是
在这里插入图片描述
不是UTF-8编码当然会报错啦,有两种解决方法:

1.保存txt文件时将编码类型改成utf-8(或者另存为)
在这里插入图片描述

2.直接将encoding的参数改为ansi运行

txt = open("threekingdoms.txt", "r", encoding ='ansi').read()
	读取的流程是这样的,读取文件时候,按照encoding 指定的编码方式,读取文件,比如文件是 gbk 的就用 gbk 读取,并且,解码时候的decode也用gbk  解码成 Unicode字符集,如果你要打印,那么,打印的形式要将字符集编码成字符串,encode 成 gbk ,
txt = open("threekingdoms.txt", "r", encoding ='gbk').read()
print(txt)

总之这个过程可以理解为,用gbk的编码形式读取 txt 文件,解码成unicode 的形式进行内部使用,如果要打印出来,则用decode把Unicode 解码成字符串的形式输出

简单总结

	中国人民通过对 ASCII 编码的中文扩充改造,产生了 GB2312 编码,可以表示6000多个常用汉字。

汉字实在是太多了,包括繁体和各种字符,于是产生了 GBK 编码,它包括了 GB2312 中的编码,同时扩充了很多。
中国是个多民族国家,各个民族几乎都有自己独立的语言系统,为了表示那些字符,继续把 GBK 编码扩充为 GB18030 编码。
每个国家都像中国一样,把自己的语言编码,于是出现了各种各样的编码,如果你不安装相应的编码,就无法解释相应编码想表达的内容。

终于,有个叫 ISO 的组织看不下去了。他们一起创造了一种编码 UNICODE ,这种编码非常大,大到可以容纳世界上任何一个文字和标志。所以只要电脑上有 UNICODE 这种编码系统,无论是全球哪种文字,只需要保存文件的时候,保存成 UNICODE 编码就可以被其他电脑正常解释。
UNICODE 在网络传输中,出现了两个标准 UTF-8 和 UTF-16,分别每次传输 8个位和 16个位。于是就会有人产生疑问,UTF-8 既然能保存那么多文字、符号,为什么国内还有这么多使用 GBK 等编码的人?因为 UTF-8 等编码体积比较大,占电脑空间比较多,如果面向的使用人群绝大部分都是中国人,用 GBK 等编码也可以。

解决

一般是在代码的最开始第一行声明编码方式

# -*- coding=utf-8 -*-

比如
彻底搞懂Python编码,解码 encode decode_第4张图片
大多数的问题都是出现在

你可能感兴趣的:(python大全,又大又全)