计算机字符编码简单梳理

ASCII

ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其西欧语言。

码表如下:

计算机字符编码简单梳理

观察表可得出:

  • 0-31和127是控制字符或通信专用字符,例如6号字符ACK用于计算就网络的通信
  • 48-57号字符标识阿拉伯数字0-9,48-57即8为二进制数0011 0000 - 0011 1001,即后四位可看作0-9的8421
  • 65-90号字符为大写字母A-Z,8位二进制数0100 0001 - 01011010,前三位均为010,后五位为1-26的二进制数
  • 97-122号字符为小写字母a-z,8位二进制数0110 0001 - 0111 1010,前三位均为011,后五位为1-26的二进制数

由此规律,若告诉大写X的二进制码为0101 1000,则直接得出小写x的二进制码为0111 1000

GB2312-80

为使中国汉字也可在计算机上表示出来,1980年国家标准局发布了GB2312-80编码

区位码

基本集共收入汉字6763个和非汉字图形字符682个。整个字符集分成94个区,每区有94个位。每个区位上只有一个字符,因此可用所在的区和位来对汉字进行编码,成为区位码。

01-09区收录除汉字外的682个字符

10-15区为空白区,没有使用

16-55区收录3755个一级汉字,按拼音排序

56-87区收录3008个二级汉字。按部首/笔画排序

88-94区为空白区,没有使用

可通过区位码查询自己了解一下

例如:

计算机字符编码简单梳理

可得的区位码为4650

国标码

在区位码设计时,为将ASCII码中英文数字之类包含在内,将非中文字符放在了01-09区,可问题是还有32个控制通信字符没有考虑在内

因此,将区码和位码均偏移32位,即都加上20H

那为什么区码和位码都要加20H呢,因为英文采用ASCII码,0-127个字符,即2的7次方个字符,占了7位,最高位补0,满8位位一个字节。例如我向朋友发送字符A,在机器码中则表示为0100 0001。而区位码的存在,使得表示中国汉字需要两个字节,因此,每个字节都要加上20H,给32个特殊字符让出位置

因此的区位码4650(2E32)转化为国标码为4E52(2E+20 32+20)

机内码

在前面提到过,A占一个字节,8位二进制数为0100 0001,最高位0是一个标识,表示这是一个ASCII码

而国内码转化为二进制流后,为避免与ASCII码发生冲突,则将最高位定位1,这样1100 0001就代表着一个GB2312编码,计算机就不是将其判定为ASCII码

因此在国标码的基础上,区码和位码均加上1000 0000即80H

因此的机内码为CED2(4E+80 52+80)

可用Python验证一下:

计算机字符编码简单梳理

计算机字符编码简单梳理

与我们计算的完全一致!

GBK和UTF-8

随着互联网发展,GB2312编码不能够满足中国字符的表达(中国汉字有上万个),因此在GB2312的基础上,做出了扩展,这里不做深究了。

世界上国家太多了,一个国家一套编码不太现实。这个世界从来都是有需求就有供应。这时候,为拯救你的硬盘和流量,ISO(International Organization for Standardization)国际标准组织就站出来要融合世界所有字符,经过长期的发展,形成了UTF-8编码

UTF-8编码盛行的当下,gb2312和gbk编码亦有着广泛的使用…

上一篇:[转载]—— Android JNI知识点


下一篇:C语言枚举常量、字符常量、字符串常量