字符编码

 

一 了解字符编码的知识储备

这张图什么意思?

意思是应用程序任操作的本质上都是要先向操作系统发出请求,然后操作系统会从硬盘上调取数据然后在反馈给应用程序。

 

二 文本编辑器的存取原理

1⃣️、首先我们要在文本编辑器上输入任何数据,都会存放在内存当中,当突然断电时,数据也就会消失的。

2⃣️、当我们保存时,数据会通过操作系统,会储存在硬盘中。这样数据就会永久保存下来。

3⃣️、当我们在使用py软件没有执行时,本质上就和文本编辑器一样,输入的其实就是一堆数据而已。

三 文本编辑器和python编辑器的区别

最大的区别就是在执行前,大家都一个样。但python编辑器可以被识别python代码来执行,来执行文件内代码。

 

 二  字符编码

为啥要了解字符编码?

编程最大的损失就是因为乱码。通过了解字符编码可以降低这种风险,关键必要时候可以装逼!(😄😄😄)

1⃣️、字符编码

计算机必须要通电,才能运行。基于‘电’的特性,分别为高低电平,高电平用“1”来表示,低电平用“0”来表示。所以,计算机只能读的懂二进制(1,0)。但,想让计算机能够读懂人类的字符,必须要翻译成二进制或者说机器语言,计算机才能读的懂,对吧。而字符编码就相当于一个翻译的作用。

人类字符------》字符编码------》机器语言

每个人类字符对应字符编码中的特定编码,这种标准就是字符编码

2⃣️、字符编码发展史与分类(了解)

计算机由美国人发明,最早的字符编码为ASCII,只规定了英文字母数字和一些特殊字符与数字的对应关系。最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号

当然我们编程语言都用英文没问题,ASCII够用,但是在处理数据时,不同的国家有不同的语言,日本人会在自己的程序中加入日文,中国人会加入中文。

而要表示中文,单拿一个字节表表示一个汉子,是不可能表达完的(连小学生都认识两千多个汉字),解决方法只有一个,就是一个字节用>8位2进制代表,位数越多,代表的变化就多,这样,就可以尽可能多的表达出不通的汉字

所以中国人规定了自己的标准gb2312编码,规定了包含中文在内的字符->数字的对应关系。

日本人规定了自己的Shift_JIS编码

韩国人规定了自己的Euc-kr编码(另外,韩国人说,计算机是他们发明的,要求世界统一用韩国编码,但世界人民没有搭理他们)

 

这时候问题出现了,精通18国语言的小周同学谦虚的用8国语言写了一篇文档,那么这篇文档,按照哪国的标准,都会出现乱码(因为此刻的各种标准都只是规定了自己国家的文字在内的字符跟数字的对应关系,如果单纯采用一种国家的编码格式,那么其余国家语言的文字在解析时就会出现乱码)

所以迫切需要一个世界的标准(能包含全世界的语言)于是unicode应运而生(韩国人表示不服,然后没有什么卵用)

ascii用1个字节(8位二进制)代表一个字符

unicode常用2个字节(16位二进制)代表一个字符,生僻字需要用4个字节

例:

字母x,用ascii表示是十进制的120,二进制0111 1000

汉字已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101

字母x,用unicode表示二进制0000 0000 0111 1000,所以unicode兼容ascii,也兼容万国,是世界的标准

 

这时候乱码问题消失了,所有的文档我们都使用但是新问题出现了,如果我们的文档通篇都是英文,你用unicode会比ascii耗费多一倍的空间,在存储和传输上十分的低效

本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间:

字符ASCIIUnicodeUTF-8
A 01000001 00000000 01000001 01000001
x 01001110 00101101 11100100 10111000 10101101

从上面的表格还可以发现,UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。

 

基于目前的现状,内存中的编码固定就是unicode,我们唯一可变的就是硬盘的上对应的字符编码。
此时你可能会觉得,那如果我们以后开发软时统一都用unicode编码,那么不就都统一了吗,关于统一这一点你的思路是没错的,但我们不可会使用unicode编码来编写程序的文件,因为在通篇都是英文的情况下,耗费的空间几乎会多出一倍,这样在软件读入内存或写入磁盘时,都会徒增IO次数,从而降低程序的执行效率。因而我们以后在编写程序的文件时应该统一使用一个更为精准的字符编码utf-8(用1Bytes存英文,3Bytes存中文),再次强调,内存中的编码固定使用unicode。
1、在存入磁盘时,需要将unicode转成一种更为精准的格式,utf-8:全称Unicode Transformation Format,将数据量控制到最精简

2、在读入内存时,需要将utf-8转成unicode
所以我们需要明确:内存中用unicode是为了兼容万国软件,即便是硬盘中有各国编码编写的软件,unicode也有相对应的映射关系,但在现在的开发中,程序员普遍使用utf-8编码了,估计在将来的某一天等所有老的软件都淘汰掉了情况下,就可以变成:内存utf-8<->硬盘utf-8的形式了。

三 总结 

1⃣️、保证不乱码的核心就是,用什么标准编码的,就用什么解码,此处就是指的就是字符编码。 

2⃣️、在内存中写的所有字符,一视同仁,都是unicode编码,比如我们打开编辑器,输入一个“你”,我们并不能说“你”就是一个汉字,此时它仅仅只是一个符号,该符号可能很多国家都在使用,根据我们使用的输入法不同这个字的样式可能也不太一样。只有在我们往硬盘保存或者基于网络传输时,才能确定”你“到底是一个汉字,还是一个日本字,这就是unicode转换成其他编码格式的过程了

 

四 字符编码应用之python

 1⃣️、在test.py指定开头名字时,一定指明用的什么存储方式。明确方式!

#coding:gbk
#coding:utf-8
#coding:shift-JIS

2⃣️、

理解字符编码的关键!!!

内存中的数据通常用16进制表示,2位16进制数据代表一个字节,如\xc9,代表两位16进制,一个字节

gbk存中文需要2个bytes,而存英文则需要1个bytes,它是如何做到的???!!!

gbk会在每个bytes,即8位bit的第一个位作为标志位,标志位为1则表示是中文字符,如果标志位为0则表示为英文字符

x=''吴Ryan吴“
转化成二进制就是:
8bit+8bit+8bit+8bit+8bit=(1+7bit)+(1+7bit)+(0+7bit)+(1+7bit)+(1+7bit)

 

 (不用纠结这里为什么是‘0’或者‘1’,就是这么规定的)

---恢复内容结束---

---恢复内容开始---

 

 

 

 

 

 

 

 

 

 

 

一 了解字符编码的知识储备

这张图什么意思?

意思是应用程序任操作的本质上都是要先向操作系统发出请求,然后操作系统会从硬盘上调取数据然后在反馈给应用程序。

 

二 文本编辑器的存取原理

1.首先我们要在文本编辑器上输入任何数据,都会存放在内存当中,当突然断电时,数据也就会消失的。

2.当我们保存时,数据会通过操作系统,会储存在硬盘中。这样数据就会永久保存下来。

3.当我们在使用py软件没有执行时,本质上就和文本编辑器一样,输入的其实就是一堆数据而已。

三 文本编辑器和python编辑器的区别

最大的区别就是在执行前,大家都一个样。但python编辑器可以被识别python代码来执行,来执行文件内代码。

 

 

 

 

 

二  字符编码

为啥要了解字符编码?

编程最大的损失就是因为乱码。通过了解字符编码可以降低这种风险,关键必要时候可以装逼!(😄😄😄)

1⃣️、字符编码

计算机必须要通电,才能运行。基于‘电’的特性,分别为高低电平,高电平用“1”来表示,低电平用“0”来表示。所以,计算机只能读的懂二进制(1,0)。但,想让计算机能够读懂人类的字符,必须要翻译成二进制或者说机器语言,计算机才能读的懂,对吧。而字符编码就相当于一个翻译的作用。

人类字符------》字符编码------》机器语言

每个人类字符对应字符编码中的特定编码,这种标准就是字符编码

2⃣️、字符编码发展史,

 

 

 

 

 

 

 

 

 

 

---恢复内容结束---

posted @ 2018-03-22 18:59  Ryansuperwa  阅读(409)  评论(0编辑  收藏  举报