文章目录
字符编码
一、字符编码储备知识
字符串类型、文本文件的内容都是由字符组成的,‘但凡涉及到字符的存取,都需要考虑字符编码的问题’
1.三大核心硬件
所有软件都是运行硬件之上的,与运行软件相关的三大核心硬件为cpu、内存、硬盘,我们需要明确三点
1、软件运行前,软件的代码及其相关数据都是存放于硬盘中的
2、任何软件的启动都是将数据从硬盘中读入内存,然后cpu从内存中取出指令并执行
3、软件运行过程中产生的数据最先都是存放于内存中的,若想永久保存软件产生的数据,则需要将数据由内存写入硬盘
2.文本编辑器读取文件内容的流程
阶段1、启动一个文件编辑器(文本编辑器如nodepad++,pycharm,word)
阶段2、文件编辑器会将文件内容从硬盘读入内存
阶段3、文本编辑器会将刚刚读入内存中的内容显示到屏幕上
3.Python解释器执行文件的流程
以Python test.py为例,执行流程如下:
阶段1、启动python解释器,此时就相当于启动了一个文本编辑器
阶段2、python解释器相当于文本编辑器,从硬盘上将test.py的内容读入到内存中
阶段3、python解释器解释执行刚刚读入的内存的内容,开始识别python语法
4.总结
Python解释器与文本编辑器的异同如下:
1、相同点:前两个阶段二者完全一致,都是将硬盘中文件的内容读入内存,详解如下
python解释器是解释执行文件内容的,因而python解释器具备读py文件的功能,这一点与文本编辑器一样
2、不同点:在阶段3时,针对内存中读入的内容处理方式不同,详解如下
文本编辑器将文件内容读入内存后,是为了显示或者编辑,根本不去理会python的语法,而python解释器将文件内容读入内存后,可不是为了给你瞅一眼python代码写的啥,而是为了执行python代码、会识别python语法)
二、字符编码介绍
1.什么是字符编码?
人类与计算机交互时,用的都是人类能读懂的字符,如中文字符、英文字符、韩文字符等、而计算机只能识别二进制数。
1.字符编码它的前提:它只跟字符类型和文本类型相关,跟视频文件、音频文件、图片文件等无关
2.计算机内部只能够认识二进制01,计算机之所以能够认识各种各样的字符,那是因为计算机的内部维护着一张字符编码表
3.字符编码表:一些字符和数字之间的对应关系!
三、字符编码的发展史
1.一家独大
我们大家都知道计算机是有美国1946年2月14日问世,当时为了让计算机识别英文字符,所以就发明了字符编码,我们都知道,
计算机只能处理数字,即0和1二进制,英文所有的字符加起来不超过127个(2的七次方)
,但是美国人考虑到后续可能出现新的字符所以加了一位以备不时之需(2的八次方),1963年ASCII码就诞生了
,当时只能识别英文不能识别其他字符
'''内部维护的是一张ASCII码表'''
1.它的内部是英文字符和数字之间的对应关系
2.它统一使用的是一个字节保存一个字符:一个字节8位
3.8位二进制能够表示多少个字符?
2**8 - 256
4.为什么使用8位来表示?
方便后续添加字符
2.群雄割据
后来,世界各地都开始使用计算机了,但是很多国家用的不是英文,他们的字母里有许多是ASCII里没有的,为了可以在计算机 保存他们的文字,他们决定采用 127号之后的空位来表示这些新的字母、符号,还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,一直把序号编到了最后一个状态255。从128 到255这一页的字符集被称“扩展字符集”。
中国人也想使用计算机,但是ASCII码表内部没有中文字符,于是
1980年中国的编码GBK诞生了
GBK码表:它的内部记录了英文、中文和数字之间的对应关系
它使用两个字节及以上自己来保存中文字符
日本人就为了让计算机识别他们的日文字符,也研究了一套字符编码表
Shift_JIS表
Shift_JIS表:只有日文字符、英文字符与数字的一一对应关系
韩国人也向让计算机能够识别韩文字符,所以也研究了一套字符编码表Euc-kr表
Euc-kr表:只有韩文字符、英文字符与数字的一一对应关系
3.天下一统
当时各个国家都像中国这样搞出一套自己的编码标准,结果互相之间谁也不懂谁的编码,谁也不支持别人的编码,连大陆和台湾这样只相隔了150海里也使用不同编码。这个时候,出现了一个叫
ISO 组织(国际标准化组织)
决定着手解决这个问题。他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号 的编码!
他们打算叫它“Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “Unicode”。
unicode(万国码):统一使用的是2个字节来保存字符
但是Unicode同样也有2个问题:
1.计算机怎么知道二个字节为一个字符,如何识别二个字节为什么一个字符?
2.针对英文字符,如果使用大于1个字节来表示,那么低位的前面几个字节全是0。很奢侈浪费空间,因为现在计算机大部分内容还是英文。
于是后面优化到了如今熟知的UTF-8
utf-8就是目前大家统一使用的一种编码:
1. 它统一使用一个字节来保存英文字符
2. 统一使用三个字节来保存中文字符
在utf-8编码表中,一个汉字使用的是三个字节!!!
UTF系列有UTF-8、UTF-16、UTF-8mb4(能够存储表情)
四、编码与解码
1.如何解决乱码问题?
你在写文件的时候使用的是什么编码,那么你打开的时候就使用对应编码解码就行
2.Python解释器版本不同代码的编码问题
1.在python2中使用的编码表不是utf-8,而是ASCII码表。
需要用代码:coding:utf-8来进行转换。
2.在python2如何定义中文字符:
vl = u'你好'
print vl
3.如何编码和解码?
编码:把人类能够读懂的字符转化为计算机能够识别的数字(二进制)
解码:把计算机能够读懂的数字转化为人类能够读懂的字符
'''编码'''
由字符转换成内存中的unicode,以及由unicode转换
成其他编码的过程,都称为编码encode
ankn = '人生都大写着失败'
print(ankn.encode('utf-8'))
'''
转换结果:
b'\xe4\xba\xba\xe7\x94\x9f\xe9\x83\xbd\xe5\xa4\xa7\xe5\x86\x99\
#xe7\x9d\x80\xe5\xa4\xb1\xe8\xb4\xa5
'''
'''解码'''
由内存中的unicode转换成字符,以及由其他编码转换
成unicode的过程,都称为解码decode
vl = ankn.encode('utf-8')
print(vl.decode('utf-8')) #解码需要对应的字符编码才行。
'''转换结果:人生都大写着失败'''