Python学习之字符编码
字符编码
简介
字符编码(Character encoding)也称字集码,是把字符集中的字符编码为指定集合中某一对象,以便文本在计算机中存储和通过通信网络的传递。
'''计算机只能识别二进制数,字符编码将人类能读懂的字符(文字、英文等)转成二进制让计算机储存和传递 '''
字符编码表
ASCII
-
计算机起源于美国,美国需要让计算机识别英文字符,ASCII表( ASCII 是 American Standard Code for Information Interchange 的缩写)应运而生。
-
ASCII码划分为两个集合:128个字符的标准ASCII码和附加的128个字符的扩充和ASCII码。(一个英文字符对应1Bytes,1Bytes=8bit)标准ASCII码为7位(2的7次方,128),扩充为8位(2的8次方,256)。
-
基本的 ASCII 字符集共有 128 个字符,其中有 96 个可打印字符,包括常用的字母、数字、标点符号等,另外还有 32 个控制字符。

GB2312
- 当天朝也有了计算机之后,为了显示中文,必须设计一套编码规则用于将汉字转换为计算机可以接受的数字系统的数,即GB2312。
- GB2312 也是ANSI编码里的一种,对ANSI编码最初始的ASCII编码进行扩充,为了满足国内在计算机中使用汉字的需要,中国国家标准总局发布了一系列的汉字字符集国家标准编码,统称为GB码,或国标码。
- GB 2312是一个简体中文字符集,由6763个常用汉字和682个全角的非汉字字符组成。其中汉字根据使用的频率分为两级。一级汉字3755个,二级汉字3008个。
- 由于字符数量比较大,GB2312采用了二维矩阵编码法对所有字符进行编码。94行94列的方阵,对每一行称为一个“区”,每一列称为一个“位”,将所有字符有规律的填写到方阵中。

GBK
- GB 2312的出现,基本满足了汉字的计算机处理需要,但对于人名、古汉语等方面出现的罕用字,GB 2312不能处理,这导致了后来GBK及GB 18030汉字字符集的出现。
- GBK即汉字内码扩展规范,K为扩展的汉语拼音中“扩”字的声母。英文全称Chinese Internal Code Specification。GBK编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。GBK是对GB2312-80的扩展。
GB 18030主要有以下特点:
- 与UTF-8相同,采用多字节编码,每个字可以由1个、2个或4个字节组成。
- 编码空间庞大,最多可定义161万个字符。
- 支持中国国内少数民族的文字,不需要动用造字区。
- 汉字收录范围包含繁体汉字以及日韩汉字。
Unicode
-
当计算机传到世界各个国家时,为了适合当地语言和字符,就会有各自的编码表。这样各搞一套,在本地使用没有问题,一旦出现在网络中,由于不兼容,互相访问就出现了乱码现象。
-
为了解决乱码问题,Unicode(统一码、万国码、单一码、标准万国码)诞生了。
-
Unicode将世界上所有的符号都纳入其中,无论是英文、日文、还是中文等。
-
Unicode是一个很大的集合,现在的规模可以容纳100多万个符号。
'''
Unicode固然统一了编码方式,但是它的效率不高,比如UCS-4(Unicode的标准之一)规定用4个字节存储一个符号,那么每个英文字母前都必然有三个字节是0,这对存储和传输来说都很耗资源。
'''
UTF-8
-
为了提高Unicode的编码效率,于是就出现了UTF-8编码。
-
UTF-8(全称Unicode Transformation Format,即unicode的转换格式)
-
UTF-8可以根据不同的符号自动选择编码的长短。比如英文字母可以只用1个字节就够了。
#多国字符—√—》内存(unicode格式的二进制)——X—》硬盘(GBK格式的二进制)
#多国字符—√—》内存(unicode格式的二进制)——X—》硬盘(Shift_JIS格式的二进制)
#多国字符—√—》内存(unicode格式的二进制)——√—》硬盘(???格式的二进制)
''' 多国字符中包含大量的英文字符时,使用unicode格式存放会额外占用一倍空间,由内存写入硬盘时会额外耗费一倍的时间,所以将内存中的unicode二进制写入硬盘或者基于网络传输时,UTF-8即可将其转换成一种精简的格式。 '''
# 多国字符—√—》内存(unicode格式的二进制)——√—》硬盘(utf-8格式的二进制)
缺点
因为每个字符使用不同数量的字节编码,所以寻找串中第N个字符是一个O(N)复杂度的操作 — 即,串越长,则需要更多的时间来定位特定的字符。同时,还需要位变换来把字符编码成字节,把字节解码成字符。
练习
# 1.统计列表中每个数据值出现的次数并组织成字典战士
# eg: l1 = ['jason','jason','kevin','oscar']
# 结果:{'jason':2,'kevin':1,'oscar':1}
# 真实数据
# l1 = ['jason','jason','kevin','oscar','kevin','tony','kevin']
l1 = ['jason', 'jason', 'kevin', 'oscar', 'kevin', 'tony', 'kevin']
data_dict = {}
for data in l1:
if data not in data_dict:
data_dict[data] = 1
else:
data_dict[data] += 1
print(data_dict)

浙公网安备 33010602011771号