200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > unicode编码表_6-字符编码-文件处理

unicode编码表_6-字符编码-文件处理

时间:2024-03-22 01:01:02

相关推荐

unicode编码表_6-字符编码-文件处理

1、字符编码

1、什么是字符编码人类在于计算机交互时,用的都是人类能读懂的字符,如:中文字符,英文字符,日文字符的等,而计算机只能识别二进制数,详解如下:(进制数即由0和1组成的数字,例如010010101010。计算机是基于电工作的,电的特性即高低电平,人类从逻辑层面将高电平对应为数字1,低电平对应为数字0,这直接决定了计算机可以识别的是由0和1组成的数字。)由人类字符到计算机中的数字,必须经历一个过程,如下:字符----->翻译------>数字 翻译的过程必须参照一个特定的标准,该标准为字符编码表,该表上存放的就是字符与数字一一对应的关系。编码即将字符编译转换成计算机能识别的数字。2、字符编码表的发展史(1)阶段一:一家独大 # ASCII表的特点:现代计算机起源于美国,所以最先考虑仅仅是让计算机识别英文字符,于是诞生了ASCII表、1、只有英文字符与数字的一一对应关系2、一个英文字符对应1Bytes,1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符。(2)阶段二:诸侯割据、天下大乱# GBK表的特点:1、只有中文字符、英文字符与数字的一一对应关系2、一个英文字符对应1Bytes、一个中文字符对应2Bytes#补充说明:1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符2Bytes=16bit,16bit最多包含65536个数字,可以对应65536个字符,足够表示所有中文字符#Shift_JIS表的特点: 1、只有日文字符、英文字符与数字的一一对应关系# Euc-kr表的特点:1、只有韩文字符、英文字符与数字的一一对应关系#各种字符编码表的总结:英文字符--->内存(ASCII格式的二进制)--->硬盘(ASCII格式的二进制)中、英文字符--->内存(GBK格式的二进制)--->硬盘(GBK格式的二进制)日、英文字符--->内存(shift-jis的二进制)--->硬盘(shift-jis的二进制)(3)阶段三:分久必合#unicode于1990年开始研发,1994年正式公布,具备两大特点:用16bit(2Bytes)对应一个字符1. 存在所有语言中的所有字符与数字的一一对应关系,即兼容万国字符2. 与传统的字符编码的二进制数都有对应关系,详解如下很多地方或老的系统、应用软件仍会采用各种各样传统的编码,这是历史遗留问题。此处需要强调:软件是存放于硬盘的,而运行软件是要将软件加载到内存的,面对硬盘中存放的各种传统编码的软件,想让我们的计算机能够将它们全都正常运行而不出现乱码,内存中必须有一种兼容万国的编码,并且该编码需要与其他编码有相对应的映射/转换关系,这就是unicode的第二大特点产生的缘由

文本编辑器输入任何字符都是最新存在于内存中,是unicode编码的,存放于硬盘中,则可以转换成任意其他编码,只要该编码可以支持相应的字符:英文字符--->内存(unciode格式的数字)--->硬盘(ASCII格式的数字)中文字符、英文字符--->内存(unicode格式的数字)--->硬盘(gbk格式的数字)日文字符、英文字符--->内存(unicode格式的数字)--->硬盘(shift-JIS格式的数字)3、编码与解码(1)由字符转换成内存中的unicode,以及unicode转换成其他编程的过程,都成为编码encode(2)由内存中的unicode转换成字符,以及由其他编码转换成unicode的过程,都成为解码decode。

4、utf-8的由来如果保存到硬盘的是GBK格式的二进制,当初用户输入的字符只能是中文或者英文,同理如果保存到硬盘的是shift-jis格式二进制,当初用户输入的字符只能是英文或者日文,如果我们输入的字符中包含了多国字符,那么该如何处理?(1)多国字符—√—》内存(unicode格式的二进制)——X—》硬盘(GBK格式的二进制)(2)多国字符—√—》内存(unicode格式的二进制)——X—》硬盘(Shift_JIS格式的二进制)(3)多国字符—√—》内存(unicode格式的二进制)——√—》硬盘(???格式的二进制)理论上是可以将内存中unicode格式的二进制直接存放在硬盘中,但由于unicode固定使用两个字节来存储一个字符,<1>如果多国字符中包含大量的英文字符时,使用unicode格式存放会额外占用一倍空间 (英文字符其实只需要用一个字节存放即可), <2>然而空间占用并不是最致命的问题,最致命地是当我们由内存写入硬盘时会额外耗费一倍的时间.将内存中的unicode二进制写入硬盘或者基于网络传输时必须将其转换成一种精简的格式,这种格式即utf-8(全称Unicode Transformation Format,即unicode的转换格式)#万国字符--->内存(unicode格式的二进制数)--->硬盘(utf-8格式的二进制数)#那为何在内存中不直接使用utf-8呢?(1)utf-8是针对Unicode的可变长度字符编码:一个英文字符占1Bytes,一个中文字符占3Bytes,生僻字用更多的Bytes存储(2)unicode更像是一个过渡版本,我们新开发的软件或文件存入硬盘都采用utf-8格式,等过去几十年,所有老编码的文件都淘汰掉之后,会出现一个令人开心的场景,即硬盘里放的都是utf-8格式,此时unicode便可以退出历史舞台,内存里也改用utf-8,天下重新归于统一。4、字符编码的应用我们学习字符编码就是为了存取字符时不发生乱码问题:(1)内存中固定使用unicode无论输入任何字符都不会发生乱码(2)我们能够修改的是存/取硬盘的编码方式,如果编码设置不正确将会出现乱码问题。乱码问题分为两种:存乱了,读乱了(3)存乱了:如果用户输入的内容中包含中文和日文字符,如果单纯以shift_JIS存,日文可以正常写入硬盘,而由于中文字符在shift_jis中没有找到对应关系而导致存乱了。#保存后无法恢复(4)读乱了:如果硬盘中的数据是shift_JIS格式存储的,采GBK格式读入内存就读乱了。#使用与解码的存储格式一样即可打开5、python解释器(1)python解释器执行文件的流程,以python test.py为例,执行流程如下:1、启动python解释器,此时就相当于启动了一个文本编辑器2、python解释器相当于文本编辑器,从硬盘上将test.py的内容读入到内存中3、python解释器解释执行刚刚读入的内存的内容,开始识别python语法(2)执行py文件的前两个阶段就是python解释器读文本文件的过程,与文本编辑文本文件的前两个阶段没有任何区别,如何保证读不乱码?1、必须将python解释器读文件时采用的编码方式设置为文件当初写入硬盘时编码格式,如果没有设置,python解释器则使用默认的编码方式,py3中为utf-8,py-2位ASCII。2、在文件首行写入包含#号在内的以下内容fp:#coding:utf-8#原理:解释器会先用默认的编码当时读取文件的首行内容,由于首行是纯英文组成,而任何编码方式都可以识别英文字符。(3)python解释器执行文件的第三个阶段python解释器终端识别内存中的格式:1、在Python3中,字符串类的值都是使用unicode格式来存储2、由于Python2的盛行是早于unicode的,因此在Python2中是按照文件头指定的编码来存储字符串类型的值的(如果文件头中没有指定编码,那么解释器会按照它自己ASCII格式的文件存储上),所以,这就有可能导致乱码问题.# coding:utf-8x = '上' # x的值为untf-8格式的二进制print(x) 打印操作是将x的值,即utf-8格式的二进制交给终端,当终端收到后发现并不是unicode(只有unicode才与字符有对应关系),所以终端会执行操作:utf-8二进制---解码-->unicode格式的二进制,解码的过程终端会采用自己默认的编码,而在pycharm的终端默认编码为utf-8、windows下的cmd终端的默认编码为gbk,所以该打印操作在pycharm中显示正常,而在windows下的cmd中则乱码# 在windows下的cmd中运行效果如下C:UsersAdministrator>python2 E:aaa.py涓(4)字符串encode编码与decode解码的使用# 1、unicode格式------编码encode-------->其它编码格式>>> x='上' # 在python3在'上'被存成unicode>>> res=x.encode('utf-8')>>> res,type(res) # unicode编码成了utf-8格式,而编码的结果为bytes类型,可以当作直接当作二进制去使用(b'xe4xb8x8a', <class 'bytes'>)# 2、其它编码格式------解码decode-------->unicode格式>>> res.decode('utf-8') '上'#总结python2解释器默认使用字符编码是asciipython3解释器默认使用的字符编码是utf-8python2的str就是python3的bytespython3的uicode就是python3的str

2、文件处理

1、文件的打开模式一:控制读写操作模式r:只读--->默认w:只写a:只追加写2、控制读写内容的模式t:读写都是文本格式,即读写都是用字符串--->默认b:读写都是bytes格式,bytes等同于二进制#如果是t模式一定要加上encoding="编码格式"如果是b模式一定不加encoding="编码格式"3、案例3.1 案例1r:在文件存在的时候,文件指针调到文件开头,文件不存在直接报错f=open("a.txt",mode="rt",encoding='utf-8')# res=f.read()# print(res)f.close()3.2 案例2w:在文件存在的时候会清空文件,文件指针调到文件开头,文件不存在会创建空文档f=open("c.txt",mode="wt",encoding='utf-8')# f.write("aaaan")# f.write("bbbbn")# f.write("ccccn")f.write("11111n")f.close() 3.3 案例3a:在文件存在的时候不会清空文件,文件指针调到文件末尾,文件不存在会创建空文档f=open("d.txt",mode="at",encoding='utf-8')f.write("6666666n")f.write("6666666n")f.write("6666666n")f.write("11111n")f.close() 3.4 案例4:rb wb abf=open("a.txt",mode='rb')res=f.read()print(res.decode("utf-8"))f.close()f=open("D:fullstack16day05视频01 本周内容.mp4",mode='rb')res=f.read()print(res)f.close()f=open("a.txt",mode='ab')f.write("你好".encode('utf-8'))f.close()with open(r"D:fullstack16day05视频01 本周内容.mp4",mode='rb') as f1,open(r"D:111111.mp4",mode="wb") as f2:# res=f1.read()# f2.write(res)for line in f1:f2.write(line)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。