字符编码的介绍

字符编码的介绍

  • 前提知识了解
  • 字符编辑的介绍
  • 字符编辑的发展
  • UTF-8的由来
  • 字符编码的应用
  • 编码和解码

前提知识了解

三大核心硬件

所有软件都是运行硬件之上的,与运行软件相关的三大核心硬件为cpu、内存、硬盘,我们需要明确三点

#1、软件运行前,软件的代码及其相关数据都是存放于硬盘中的

#2、任何软件的启动都是将数据从硬盘中读入内存,然后cpu从内存中取出指令并执行

#3、软件运行过程中产生的数据最先都是存放于内存中的,若想永久保存软件产生的数据,则需要将数据由内存写入硬盘

文本编辑器读取文件内容的流程

#阶段1、启动一个文件编辑器(文本编辑器如nodepad++,pycharm,word)

#阶段2、文件编辑器会将文件内容从硬盘读入内存

#阶段3、文本编辑器会将刚刚读入内存中的内容显示到屏幕上

文本编辑器将文件内容读入内存后,是为了显示或者编辑,根本不去理会python的语法,而python解释器将文件内容读入内存后,可不是为了给你瞅一眼python代码写的啥,而是为了执行python代码、会识别python语法)

字符串编码的介绍

字符编码它的前提

# 字符编码它的前提:它只跟字符类型和文本类型相关,跟视频文件、音频文件、图片文件等无关
计算机内部只能够认识二进制01,计算机之所以能够认识各种各样的字符,那是因为计算机的内部维护着一张字符编码表

字符编码

字符编码(Character Encoding):字符编码是指一种映射规则,根据这个映射规则可以将某个字符映射成其他形式的数据以便在计算机中存储和传输。例如ASCII字符编码规定使用单字节中低位的7个比特去编码所有的字符,在这个编码规则下字母A的编号是65(ASCII码),用单字节表示就是0x41,因此写入存储设备的时候就是二进制的 01000001。每种字符集都有自己的字符编码规则,常用的字符集编码规则还有 UTF-8编码、GBK编码、Big5编码等。

字符编码的发展

一家独大

上个世纪60年代,美国制定了一套字符编码规则,对英语字符与二进制位之间的关系做了统一规定,这编码规则被称为ASCII编码,一直沿用至今。

ASCII编码一共规定了128个字符的编码规则,这128个字符形成的集合就叫做ASCII字符集。在ASCII编码中,每个字符占用一个字节的后面7位,最前面的1位统一规定为0。在ASCII编码中,0~31 是控制字符如换行回车删除等,32~126 是可打印字符,可以通过键盘输入并且能够显示出来。(下图是ASCII字符集中字符和码值的对应关系)

五代十国

英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。所以当ASCII码到欧洲的时候,一些欧洲国家就决定对ASCII编码进行适当的“改造”:利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。这个编码统称为EASCII(Extended ASCII)。

但是欧洲的语言体系有个特点:小国家特别多,每个国家可能都有自己的语言体系,语言环境十分复杂。因此即使EASCII可以表示256个字符,也不能统一欧洲的语言环境。

为了解决上面这个问题,人们想出了一个折中的方案:在EASCII中表示的256个字符中,前128字符和ASCII编码表示的字符完全一样,后128个字符每个国家或地区都有自己的编码标准。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0—127表示的符号是一样的,不一样的只是128—255的这一段。

根据这个规则,就形成了很多子标准:ISO-8859-1、ISO-8859-2、ISO-8859-3、……、ISO-8859-16。这些子标准适用于欧洲不同的国家地区。

大一统

ASCII码字符集,总共才能容纳256个字符,对于全世界各国语言来说,很难全部包含在内,所有后来就出现了Unicode字符集。

Unicode字符集是一个很大的字符集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字“严”。
需要注意的是,Unicode只是一个字符集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何编码如何存储。这就造成了两个问题:

第一个问题是,如何才能区别Unicode和ASCII?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?
第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。
为了解决Unicode字符集存在的问题,就出现了UTF(Unicode Transformation Formats)系列的编码规则。UTF编码规则具体规定了Unicode字符集中的字符是如何编码的。

总结:Unicode是一个很大的字符集,这个字符集只规定了这个字符集中每个字符对应的码值是多少,但是这个字符集并没有规定具体的编码规则,具体的编码规则有UTF系列的编码规则实现。
文本编辑器输入任何字符都是最新存在于内存中,是unicode编码的,存放于硬盘中,则可以转换成任意其他编码,只要该编码可以支持相应的字符

# 英文字符可以被ASCII识别
英文字符--->unciode格式的数字--->ASCII格式的数字

# 中文字符、英文字符可以被GBK识别
中文字符、英文字符--->unicode格式的数字--->gbk格式的数字

# 日文字符、英文字符可以被shift-JIS识别
日文字符、英文字符--->unicode格式的数字--->shift-JIS格式的数字

UTF-8的由来

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码规则,又称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到4个字节编码Unicode字符。用在网页上可以统一页面显示中文简体繁体及其它语言(如英文,日文,韩文)
UTF-8就是在互联网上使用最广的一种Unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。重复一遍,这里的关系是:UTF-8编码是Unicode的实现方式之一。
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度(UTF-8编码可以容纳2^21个字符,总共200多万个字符)。
再次强调一个概念:就是Unicode是一个字符集,这个字符集世界上所有的字符定义了一个唯一编码。其仅仅规定了每个符号的二进制代码,没有制定细化的存储规则。UTF-8、UTF-16、UTF-32才是Unicode的存储格式定义。

字符编码的应用

1. 如何解决乱码问题?
	你在写文件的时候使用的是什么编码,那么你打开的时候就使用对应编码解码就行

2. Python解释器版本不同代码的编码问题
	"""
		在python2中使用的编码表不是utf-8,而是ASCII码表
            # coding:utf-8
        
        """它使用的是ASCII码表"""
            # 在Python2 中如何定义中文字符
            s = u'你好'
            print s
	"""

编码和解码

由字符转换成内存中的unicode,以及由unicode转换成其他编码的过程,都称为编码encode

编码

由内存中的unicode转换成字符,以及由其他编码转换成unicode的过程,都称为解码decode

解码

把计算机能够读懂的数字转化为人类能够读懂的字符
 # 编码
    # res = '趁年轻,学技能,养活自己'
    res = '趁年轻'
    # print(res.encode('utf-8')) # b'\xe8\xb6\x81\xe5\xb9\xb4\xe8\xbd\xbb' bytes


                                         # b'\xe8\xb6\x81\xe5\xb9\xb4\xe8\xbd\xbb'
    # 解码
    res1 = res.encode('utf-8')
    print(res1.decode('utf-8'))  # 趁年轻

    """如果遇到解码的时候,你不指定使用什么编码进行解码,你就试:utf-8 gbk"""

    # 扩展
    res2 = 'hello world'
    print(res2.encode('utf-8'))
    # print(b'hello world')

热门相关:藏娇记事   拒嫁豪门,前妻太抢手   拒嫁豪门,前妻太抢手   宠物小精灵之庭树   精灵掌门人