字符编码是将人类的字符编码成计算机能识别的数字,这种转换必须遵循一套固定的标准,该标准无非是人类字符与数字的对应关系,称之为字符编码表。python
计算机由美国人发明,最先的字符编码为ASCII,只规定了英文字母数字和一些特殊字符与数字的对应关系。最多只能用 8 位来表示(一个字节),即:2**8 = 256,因此,ASCII码最多只能表示 256 个符号。编程
固然咱们编程语言都用英文没问题,ASCII够用,可是在处理数据时,不一样的国家有不一样的语言,中国人会加入中文,日本人会在本身的程序中加入日文,韩国人也是。app
可是要表示中文,单拿一个字节表表示一个汉子,是不可能表达完的(连小学生都认识两千多个汉字),解决方法只有一个,就是一个字节用>8位2进制表明,位数越多,表明的变化就多,这样,就能够尽量多的表达出不通的汉字。编程语言
因此中国人规定了本身的标准gb2312编码,规定了包含中文在内的字符与数字的对应关系。编辑器
日本人规定了本身的Shift_JIS编码;韩国人规定了本身的Euc-kr编码(另外,韩国人说,计算机是他们发明的,要求世界统一用韩国编码,但世界人民没有搭理他们)。学习
这时候问题出现了,精通18国语言的小周同窗谦虚的用8国语言写了一篇文档,那么这篇文档,按照哪国的标准,都会出现乱码(由于此刻的各类标准都只是规定了本身国家的文字在内的字符跟数字的对应关系,若是单纯采用一种国家的编码格式,那么其他国家语言的文字在解析时就会出现乱码)。因此迫切须要一个世界的标准(能包含全世界的语言)因而Unicode应运而生(韩国人表示不服,而后没有什么卵用)。编码
ascii用1个字节(8位二进制)表明一个字符;Unicode经常使用2个字节(16位二进制)表明一个字符,生僻字须要用4个字节。操作系统
例:字母x,用ascii表示是十进制的120,二进制0111 1000。3d
汉字中已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101。指针
字母x,用Unicode表示二进制0000 0000 0111 1000,因此Unicode兼容ascii,也兼容万国,是世界的标准。
这时候乱码问题消失了,全部的文档咱们都使用可是新问题出现了,若是咱们的文档通篇都是英文,你用Unicode会比ascii耗费多一倍的空间,在存储和传输上十分的低效。
本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8(Unicode Transformation Format-8)编码。UTF-8编码把一个Unicode字符根据不一样的数字大小编码成1-6个字节,经常使用的英文字母被编码成1个字节,汉字一般是3个字节,只有很生僻的字符才会被编码成4-6个字节。若是你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间:
字符 | ASCII | Unicode | UTF-8 |
---|---|---|---|
A | 01000001 | 00000000 01000001 | 01000001 |
中 | x | 01001110 00101101 | 11100100 10111000 10101101 |
从上面的表格还能够发现,UTF-8编码有一个额外的好处,就是ASCII编码实际上能够被当作是UTF-8编码的一部分,因此,大量只支持ASCII编码的历史遗留软件能够在UTF-8编码下继续工做。
内存中还使用Unicode编码,是由于历史遗留问题形成的,可是由于如今写代码使用的都是UTF-8代码,因此之后内存中的代码都将变成UTF-8代码,而且之前遗留的各个国家的代码都将被淘汰,因此将来内存中使用的编码也将使用UTF-8编码替代Unicode编码。
首先明确概念
乱码的两种状况:
存文件时,因为文件内有各个国家的文字,咱们单以shiftjis去存,
本质上其余国家的文字因为在shiftjis中没有找到对应关系而致使存储失败。但当咱们硬要存的时候,编辑并不会报错(难道你的编码错误,编辑器这个软件就跟着崩溃了吗???),但毫无疑问,不能存而硬存,确定是乱存了,即存文件阶段就已经发生乱码,而当咱们用shiftjis打开文件时,日文能够正常显示,而中文则乱码了。
存文件时用utf-8编码,保证兼容万国,不会乱码,而读文件时选择了错误的解码方式,好比gbk,则在读阶段发生乱码,读阶段发生乱码是能够解决的,选对正确的解码方式就ok了。
1.1执行python程序的三个阶段
阶段二:Python解释器此时就是一个文本编辑器,负责打开文件test.py,即从硬盘中读取test.py的内容到内存中
阶段三:读取已经加载到内存的代码(Unicode编码格式),而后执行,执行过程当中可能会开辟新的内存空间,好比name="nick
件操做的基础模式有三种(默认的操做模式为r模式):
文件读写内容的格式有两种(默认的读写内容的模式为b模式):
须要注意的是:t、b这两种模式均不能单独使用,都须要与r/w/a之一连用
r: read,只读模式,只能读不能写,文件不存在时报错。
f.read()读取文件指针会跑到文件的末端,若是再一次读取,读取的将是空格。
w: 只能写,不能读,文件存在的时候回清空文件后再写入内容;文件不存在的时候会建立文件后写入内容。
a: 能够追加。文件存在,则在文件的末端写入内容;文件不存在的时候会建立文件后写入内容。
b模式是通用的模式,由于全部的文件在硬盘中都是以二进制的形式存储的,须要注意的是:b模式读写文件,必定不能加上encoding参数,由于二进制没法再编码
with open()方法不只提供自动释放操做系统占用的方法,而且with open可使用逗号分隔,一次性打开多个文件,实现文件的快速拷贝。
with open('32.txt', 'rb') as fr, \ open('35r.txt', 'wb') as fw: f.write(f.read())