python--基础知识点--ASCII、EASCII、GBK、UNICODE、UTF-8、python3编解码、字符在显示原理

ASCII

  每个做JavaWeb开发的新手都会遇到乱码问题,每个做Python爬虫的新手都会遇到编码问题,为什么编码问题那么蛋疼呢?

  这个问题要从1992年Guido van Rossum创造Python这门语言说起,那时的Guido绝对没想到的是Python这门语言在今天会如此受大家欢迎,也不会想到计算机发展速度会如此惊人。Guido在当初设计这门语言时是不需要关心编码的,因为在英语世界里,字符的个数非常有限,26个字母(大小写)、10个数字、标点符号、控制符,也就是键盘上所有的键所对应的字符加起来也不过是一百多个字符而已。这在计算机中用一个字节的存储空间来表示一个字符是绰绰有余的,因为一个字节相当于8个比特位,8个比特位可以表示256个符号。于是聪明的美国人就制定了一套字符编码的标准叫ASCII(American Standard Code for Information Interchange),每个字符都对应唯一的一个数字,比如字符A对应的二进制数值是01000001,对应的十进制就是65。最开始ASCII只定义了128个字符编码,包括96个文字和32个控制符号,一共128个字符,只需要一个字节的7位就能表示所有的字符,因此ASCII只使用了一个字节的后7位,最高位都为0。
在这里插入图片描述

EASCII(ISO/8859-1)

  然而计算机慢慢地普及到其他西欧地区时,他们发现还有很多西欧所特有的字符是ASCII编码表中没有的,于是后来出现了可扩展的ASCII叫EASCII,顾名思义,它是在ASCII的基础上扩展而来,把原来的7位扩充到8位,它完全兼容ASCII,扩展出来的符号包括表格符号、计算符号、希腊字母和特殊的拉丁符号。然而EASCII时代是一个混乱的时代,大家没有统一标准,他们各自把最高位按照自己的标准实现了自己的一套字符编码标准,比较著名的就有 CP437,CP437是Windows系统中使用的字符编码,如下图:

cp437
在这里插入图片描述
另外一种被广泛使用的EASCII还有 ISO/8859-1(Latin-1),它是国际标准化组织(ISO)及国际电工委员会(IEC)联合制定的一系列8位元字符集的标准,ISO/8859-1只继承了CP437字符编码的128-159之间的字符,所以它是从160开始定义的,不幸的是这些众多的ASCII扩充字集之间互不兼容。

iso8859-1
在这里插入图片描述

GBK

  随着时代的进步,计算机开始普及到千家万户,比尔盖茨让每个人桌面都有一台电脑的梦想得以实现。但是计算机进入中国不得不面临的一个问题就是字符编码,虽然咱们国家的汉字是人类使用频率最多的文字,汉字博大精深,常见的汉字就有成千上万,这已经大大超出了ASCII编码所能表示的字符范围了,即使是EASCII也显得杯水车薪,于是聪明的中国人自己弄了一套编码叫 GB2312,又称GB0,1981由中国国家标准总局发布。GB2312编码共收录了6763个汉字,同时它还兼容ASCII。GB2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。不过GB2312还是不能100%满足中国汉字的需求,对一些罕见的字和繁体字GB2312没法处理,后来就在GB2312的基础上创建了一种叫GBK的编码。GBK不仅收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。同样GBK也是兼容ASCII编码的,对于英文字符用1个字节来表示,汉字用两个字节来标识

Unicode

  对于如何处理中国人自己的文字我们可以另立山头,按照我们自己的需求制定一套编码规范,但是计算机不止是美国人和中国人用啊,还有欧洲、亚洲其他国家的文字诸如日文、韩文全世界各地的文字加起来估计也有好几十万,这已经大大超出了ASCII码甚至GBK所能表示的范围了,况且人家为什么用采用你GBK标准呢?如此庞大的字符库究竟用什么方式来表示好呢?于是统一联盟国际组织提出了Unicode编码,Unicode的学名是“Universal Multiple-Octet Coded Character Set”,简称为UCS。

  Unicode有两种格式:UCS-2和UCS-4。UCS-2就是用两个字节编码,一共16个比特位,这样理论上最多可以表示65536个字符,不过要表示全世界所有的字符显然65536个数字还远远不够,因为光汉字就有近10万个,因此Unicode 4.0规范定义了一组附加的字符编码,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)。

  Unicode理论上完全可以涵盖一切语言所用的符号。世界上任何一个字符都可以用一个Unicode编码来表示,一旦字符的Unicode编码确定下来后,就不会再改变了。但是Unicode有一定的局限性,一个Unicode字符在网络上传输或者最终存储起来的时候,并不见得每个字符都需要两个字节,比如一字符“A“,用一个字节就可以表示的字符,偏偏还要用两个字节,显然太浪费空间了。第二问题是,一个Unicode字符保存到计算机里面时就是一串01数字,那么计算机怎么知道一个2字节的Unicode字符是表示一个2字节的字符呢,还是表示两个1字节的字符呢,如果你不事先告诉计算机,那么计算机也会懵逼了。Unicode是字符集,只规定如何编码,并没有规定如何传输、保存这个编码。例如“汉”字的Unicode编码是 6C49。unicode-string编码规则可以用6个 ASCII 字符(\u6C49)来传输、保存这个编码;也可以用UTF-8编码规则的3个连续的字节 E6 B1 89来表示它。关键在于通信双方都要认可。因此Unicode编码有不同的实现方式,比如:UTF-8、UTF-16、UTF-32等等。这里的Unicode就像英语一样,做为国与国之间交流世界通用的标准,每个国家有自己的语言,他们把标准的英文文档翻译成自己国家的文字,这是实现方式,就像UTF-8。

  Unicode是字符集;UTF-8是编码规则。
  字符集:为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point)。
  编码规则:将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)。

UTF-8

  UTF-8(Unicode Transformation Format)作为Unicode的一种实现方式,广泛应用于互联网,它是一种变长的字符编码,可以根据具体情况用1-4个字节来表示一个字符。比如英文字符这些原本就可以用ASCII码表示的字符用UTF-8表示时就只需要一个字节的空间,和ASCII是一样的。对于多字节(n个字节)的字符,第一个字节的前n为都设为1,第n+1位设为0,后面字节的前两位都设为10。剩下的二进制位全部用该字符的UNICODE码填充。
在这里插入图片描述
  以汉字“好”为例,“好”对应的Unicode是 597D,对应的区间是 0000 0800–0000 FFFF,因此它用UTF-8表示时需要用3个字节来存储,597D 用二进制表示是: 0101100101111101,填充到 1110xxxx 10xxxxxx 10xxxxxx 得到11100101 10100101 10111101,转换成16进制:E5A5BD,因此“好”的Unicode“597D”对应的UTF-8编码是“E5A5BD”。

PYTHON3编解码

在这里插入图片描述

字符显示原理

  显示汉字、英文字符和彩色图形的过程就是将字符和图形信息转换成液晶显示器可以显示的点阵信息。为了显示字符,可以将ASCII码字符点阵字库和按区位码排列的汉字点阵字库存储在单片机外接的Flash ROM中(构成点阵数据区),并且将程序中用到的字符以机内码的形式存储在Flash ROM中(构成文本数据区)。显示时,单片机将汉字机内码从文本数据区读出,转换成Flash ROM中点阵数据区的字库地址,通过该地址读出字符的点阵数据,进一步转换成液晶显示器可显示的数据并送给后续电路处理和显示。这样在操作过程中可以显示包括国标一/二级汉字、大小写英文字符、标点和数字等多种字符。显示彩色图形的时候,由于图片的存储空间要求比较大,系统中没有足够的空间,可以将PC机内bmp格式的彩色图片经过格式转化以后,通过串口送给单片机实时处理并显示。

  UCDOS软件中的文件HZK16与文件ASC16分别为16×16的国标汉字点阵文件和8×16的ASCII码点阵文件,以二进制格式存储。在文件 HZK16中,按汉字区位码从小到大依次存有国标区位码表中的所有汉字,每个汉字占用32个字节(16×16的汉字点阵),每个区为94个汉字。在文件 ASC16中按ASCII码从小到大依次存有8×16的ASCII码点阵,每个ASCII码占用16个字节。

  在PC机的文本文件中,汉字是以机内码的形式存储的,每个汉字占用两个字节。第一个字节为区码,为了与ASCII码区别,范围从十六进制的0A1H开始(小于80H的为ASCII码字符),对应区位码中区码的第一区;第二个字节为位码,范围也是从0A1H开始,对应某区中的第一个位码。这样,将汉字机内码减去0A0A0H就得该汉字的区位码。例如汉字“我”的机内码为十六进制的“CED2”,其中“CE”表示区码,“D2”表示位码。所以“我”的区位码为0CED2H-0A0A0H=2E32H.将区码和位码分别转换为十进制得汉字“我”的区位码为“4650”,即“房”的点阵位于第46区的第50个字的位置,相当于在文件HZK16中的位置为第32×[(46-1)×94+(50-1)]=67136 B以后的32个字节为“我”的显示点阵。

  依次读出每个字节,每读出一个字节,并提取该字节中的每一位,如果某位是“1”,则给该位数据对应的像素点送入两个字节的字体颜色数据,如(0x0000,黑色);如果某位是“0”,则给该位数据对应的像素点送入两个字节的底色数据,如(0xffff,白色)。当发送完32个字节的点阵数据后(总共发送的颜色数据为32B×8dot×2B=512 B)液晶屏上便会显示底色为白色,字体颜色为黑色的汉字。汉字“我”的显示结果如图3所示。
在这里插入图片描述
  液晶显示器的色彩深度为16位,每个像素可显示65 536色。SRAM(显存)工作在字(word)操作模式下,将SRAM中的每个字与液晶显示器的每个像素对应。比如将液晶显示器第一行第一列的点与SRAM的 0x0000地址对应,第一行第二列的点与0x0001地址对应,依次类推。

【参考博客】
https://baijiahao.baidu.com/s?id=1553138549532268&wfr=spider&for=pc
http://m.elecfans.com/article/633697.html

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值