Fork me on GitHub

ASCII-UTF码解析

总结

ASCII 码 Unicode UTF-8 GBK/GB18030
产生 从文字、图像等到计算机的0/1处理方式的编码 ASCII码支持的字符过少,Unicode产生 解决Unicode的缺陷,针对Unicode的可变长编码方式 ASCII码不支持中文,解决中文编码问题
字节 1个字节 2个字节 1-4个字节,可变长
字符占位 一个字符占1个字节 一个字符占2个字节 英文占1个字节
汉字占3个字节
英文1个字节,中文2个字节

ASCII码

在计算机中无论任何数据的传输、存储、持久化,都是以二进制的形式体现的。

ASCII由来

人类只认识文字,计算机只认0和1,产生了从文字到0、1的映射

  • 文字----> 0/1:编码
  • 0/1---->文字:解码

计算机只能处理0、1,如果需要处理文字,要先将文字转成数字。最早的计算机将8个比特(bit)作为一个字节(byte)

一个字节一共可以用来表示256(2的8次方)种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000011111111。0-255之间用来表示英文字母,数字和一些符号,这个编码就是ASCII码

ASCII 码一共规定了128个字符的编码,比如空格SPACE是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的一位统一规定为0

ASCII码是8位表示一个字符

奇偶校验

ASCII 码采用指定 7 位或 8 位二进制组合来表示 128 或 256 种字符。奇偶校验表示的是一个字节中1的个数必须是奇数或者偶数个。

7 位 ASCII 码 8 位 ASCII 码
名称 基础 ASCII 码 基础 ASCII 码 + 扩展 ASCII 码(后 128 个)
范围 0x00 - 0x7F (0 - 127) 0x00 - 0xFF(0 - 255)
说明 理论上只用到 7 位,一个字节的最高位有特殊用途(不一定为 0) 前面 128 个兼容 7 位 ASCII,在 7 位基础上最高位补 0

标准 ASCII 码:标准 ASCII 码每个字符采用 8 bit(1 byte)传输,在 7 位 ASCII 码基础上,最高位用于奇偶校验。

奇校验:代码一个字节中 1 的个数必须是奇数个。以 7 位 ASCII 码的奇校验为例,如果 7 位中有奇数个 1,最高位补 0;如果 7 位中有偶数个 1,最高位补 1

偶校验:代码一个字节中 1 的个数必须是偶数个。以 7 位 ASCII 码的奇校验为例,如果 7 位中有奇数个 1,最高位补 1;如果 7 位中有偶数个 1,最高位补 0


Unicode

Unicode由来

由于计算机一开始是老外发明的, 英文字母只用一个字节表示 ,没有将其他国家的字符考虑进去,所以其他国家有了自己的编码:中国制定了GB2312( 使用两个字节表示一个汉字 ),日本和韩国等也有了自己的编码。

世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。如果有一种编码,将世界上所有的符号都纳入其中, 就可以统一全球所有语言的所有字符 。

为了统一标准,通用字符集(Universal Character Set, UCS)制定了两种标准字符集: UCS-2 、UCS-4。分别表示 2 个字节定长字符编码和 4 个字节定长字符编码。

Unicode 编码采用 2 字节(16 bit)表示一个字符,对于以前的 ASCII 码则高字节全部补 0 进行处理。

总结:Unicode解决的是ASCII只能表示少量字符(256个,2的8次方)的问题Unicode编码采用2个字节(16bit)表示一个字符

Unicode缺点

  • 和ASCII码不完全兼容,对于比较老的ASCII文件,无法区分是ASCII码还是Unicode文件
  • 最多支持65536个字符(2的16次方,16位)能够支持的字符仍然是比较少的,不能囊括全球所有国家的字符
  • 采用UCS-4的4字符定长编码,可以囊括更多的字符,但是浪费了更多的空间。

UTF

Unicode为每个字符发了一张类似身份证的数字ID,这个ID号在世界上具有唯一性,起名为码点UTF,Unicode Transformation Formats,Unicode转换格式,是为了解决码点在计算机中的存储方式而设计的。

码点经过映射后得到的二进制串的转换格式称之为码元code unit

码点是一串二进制数,码元就是切分这个二进制数的方法

如果一个字符的码点二进制有n个字节(n*8个二进制),其码元为8位,则其拥有n个码元

  • utf-8:每读码点的8位代表一个字符
  • utf-16:每读码点的16位代表一个字符
  • utf-32:每读码点的32位代表一个字符

UTF-32

每32位去读一个码点。它的码元是32位,每一个 UTF-32值都可以直接表示对应的码点。 UTF-32(字符用四个字节表示),UTF-8, UTF-16同理。

UTF-8

由来

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码

UTF-8用1到4个字节编码Unicode字符。用在网页上可以统一页面显示中文简体繁体及其它语言(如英文,日文,韩文)

特点

  • 变长的编码方式,使用1-4个字节表示一个字符,即根据不同的符号而变化字节长度
  • 用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容 ;ASCIIUTF-8的一个子集

Unicode是一种编码方式,而UTF是一种存储方式,UTF-8是Unicode的一种实现方式之一

GBK

由于ASCII编码不支持中文,需要寻求一种编码方式来支持中文。国人就定义了一套编码规则:

  • 当字符小于127位时,与ASCII的字符相同
  • 但当两个大于127的字符连接在一起时,就代表一个汉字
    • 第一个字节称为高字节(从0xA1-0xF7)
    • 第二个字节为低字节(从0xA1-0xFE)

这样大约可以组合7000多个简体汉字。这个规则叫做GB2312

由于汉字众多,有些字无法表示,重新定义规则: 在要求低字节一定是127之后的编码,只要第一个字节是大于127,就固定表示这是一个汉字的开始 。这种扩展方案称之为GBK

但是,中国有56个民族,再次对编码规则进行了扩展,又加了近几千个少数民族的字符,再次扩展后得编码叫做GB18030


本文标题:ASCII-UTF码解析

发布时间:2019年10月16日 - 00:10

原始链接:http://www.renpeter.cn/2019/10/16/ASCII-UTF%E7%A0%81.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea