[什么是字符编码]
人类在与计算机交互时,用的都是人类能读懂的字符,如中文字符、英文字符、日文字符等
而计算机只能识别二进制数
二进制数即由0和1组成的数字,例如010010101010
计算机是基于电工作的,电的特性即高低电平
人类从逻辑层面将高电平对应为数字1,低电平对应为数字0,这直接决定了计算机可以识别的是由0和1组成的数字
所以,由人类的字符到计算机中的数字,一定经历一个过程
即
翻译的过程必须参照一个特定的标准
该标准称之为字符编码表
该表上存放的就是字符与数字一一对应的关系。
字符编码中的编码指的是翻译或者转换的意思
即将人能理解的字符翻译成计算机能识别的数字
【字符编码的发展史】
一家独大:ASCII(识别英文字符)-------------诸侯割据(ASCII/GBK中文/Shift_JIS日文)---------------一统天下(存在所有语言中的所有字符与数字的一一对应关系,即兼容万国字符,unicode)
1)GBK表的特点
-
只有中文字符、英文字符与数字的一一对应关系
-
一个英文字符对应1Bytes 一个中文字符对应2Bytes
-
补充说明
- 1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
- 2Bytes=16bit,16bit最多包含65536个数字,可以对应65536个字符,足够表示所有中文字符
2)unicode的特点
- 存在所有语言中的所有字符与数字的一一对应关系,即兼容万国字符
- 与传统的字符编码的二进制数都有对应关系,详解如下
- 很多地方或老的系统、应用软件仍会采用各种各样传统的编码,这是历史遗留问题。
- 此处需要强调:软件是存放于硬盘的,而运行软件是要将软件加载到内存的,面对硬盘中存放的各种传统编码的软件,想让我们的计算机能够将它们全都正常运行而不出现乱码,内存中必须有一种兼容万国的编码,并且该编码需要与其他编码有相对应的映射/转换关系,这就是unicode的第二大特点产生的缘由
字母对应ASCII表
大写的英文A-Z:65-90
小写的英文a-z:97-122
0-9:48-57
小写字母对应的数字一定大于大写字母
.
。
。
【编码和解码】
1.编码:由字符转换成内存中的unicode,以及由unicode转换成其他编码的过程,都称为编码encode
x = '上' # 在python3在'上'被存成unicode res = x.encode('utf-8') print(res, type(res)) # unicode编码成了utf-8格式,而编码的结果为bytes类型,可以当作直接当作二进制去使用 # b'\xe4\xb8\x8a' <class 'bytes'> # 只有英文字符和数字,要想编码的话,直接使用前缀b --- 字节对象没有encode方法 s = b'jh123' print(s, type(s)) # b'jh123' <class 'bytes'>
2.解码:由内存中的unicode转换成字符,以及由其他编码转换成unicode的过程,都称为解码decode
x = b'\xe4\xb8\x8a' res = x.decode('utf-8') print(res, type(res)) # 上 <class 'str'> s = b'jh123' res = s.decode('utf-8') print(res, type(res)) # jh123 <class 'str'>
【UTF-8的诞生】
【1】引言
-
如果保存到硬盘的是GBK格式二进制,当初用户输入的字符只能是中文或英文
-
同理如果保存到硬盘的是Shift_JIS格式二进制,当初用户输入的字符只能是日文或英文……
-
如果我们输入的字符中包含多国字符,那么该如何处理?
-
多国字符—√—>内存(unicode格式的二进制)——X—>硬盘(GBK格式的二进制)
-
多国字符—√—>内存(unicode格式的二进制)——X—>硬盘(Shift_JIS格式的二进制)
-
多国字符—√—>内存(unicode格式的二进制)——√—>硬盘(???格式的二进制)
【2】解决办法(utf-8)
-
理论上是可以将内存中unicode格式的二进制直接存放于硬盘中的
- 但由于unicode固定使用两个字节来存储一个字符
-
如果多国字符中包含大量的英文字符时,使用unicode格式存放会额外占用一倍空间(英文字符其实只需要用一个字节存放即可)
-
然而空间占用并不是最致命的问题
- 最致命地是当我们由内存写入硬盘时会额外耗费一倍的时间
-
所以将内存中的unicode二进制写入硬盘或者基于网络传输时必须将其转换成一种精简的格式
- 这种格式即utf-8(全称Unicode Transformation Format,即unicode的转换格式)
- 我们日常使用的字符编码都是utf8编码,但是,utf系列还有utf16 utf32... utf8mb4
- utf8只能存储正常的字符,utf8mb4可以存储表情
-
多国字符—√—>内存(unicode格式的二进制)——√—>硬盘(utf-8格式的二进制)
【3】为何在内存中不直接使用utf-8
- utf-8是针对Unicode的可变长度字符编码:
- 一个英文字符占1Bytes,
- 一个中文字符占3Bytes,生僻字用更多的Bytes存储
- unicode更像是一个过渡版本,
- 我们新开发的软件或文件存入硬盘都采用utf-8格式
- 等过去几十年,所有老编码的文件都淘汰掉之后,会出现一个令人开心的场景
- 即硬盘里放的都是utf-8格式
- 此时unicode便可以退出历史舞台
- 内存里也改用utf-8,天下重新归于统一
文本编辑器不乱码的核心法则: