【图文】有趣、通俗、严谨地解释ASCII、DBK、unicode、utf-8的区别(建议收藏)

 
 

字节是一个8位(bits)的物理存储单元。

 

字符是文化相关的符号。

 

 

 

 

 

ASCII(ANSI)

ASCII:American Standard Code for Information Interchange,美国信息互换标准代码。有时也称为ANSI
这是一切的开端。

ASCII码随着第一台意义上的计算机一同诞生。

起初,它被编到了0~127,一共128个。包括33个控制字符95个可打印字符

后来计算机得到初步推广, 一些国家的字符也请求加入ASCII。

ASCII最终被扩展到了256个——0~127的"先辈",与128~255的扩展字符集,共同组成了它

 

 

DBCS

DBCS:Double Byte Charecter Set ,双字节字符集。
它服务于中华民族。
“一个汉字顶俩个英文字符"这个"圣经”,就来源于此。

GB2312

当计算机走向世界时,什么"美帝信息互换标准代码",肯定满足不了世界人民的要求了。

于是,中国人毫不留情的将ASCII的127之后的扩展字符集砍掉。并且规定:

当两个大于127的字符连在一起时,就表示一个汉字(▲)。前面的字节称为高字节,后面的字节称为低字节
 
不行,美帝的标点符号我们也不用!英文字母和阿拉伯数字都要本土化!>_<

于是,将0~127中的英文字母、数字、标点符号全部重新编码,看作一种特殊的汉字———改为双字节

因此,这种编码方式中,字母、数字、标点符号是两种形态共存的———这就是半角全角
 
理解: GB2312是ASCII最早的中文扩展,但是只包含了6000多个常用字,不包括繁体字。

 

GBK

汉字文化博大精深,不像256的ASCII就能承载英文。GB2312标准还不够。

于是,又规定,只要第一个字节(高字节)是大于127的,不管第二位(低字节),它们都会共同表示一个汉字(▲)。

理解: GBK包含了GB2312的所有字符,并新加入了20000个汉字及汉字符号。(☑ 完全兼容GB2312)

 

GB18030

中国是一个统一的多民族的国家。字符编码自然要带上少数民族的文字

理解: GB18030又基本包含了GBK的所有字符。(☑ 基本兼容GBK)

 

(★) 重点理解的 ↓

GB2312→GBK→GB18030,是后者(兼容)包含前者的关系。变化当然不止这些。

GB2312和GBK都是双字节编码(其实是单双并存,毕竟0~127的ASCII部分天生单字节)

GB18030则是一二四字节变长编码(每种长度分别对应ASCII部分GBK部分新增部分

 
 
 
 
 
 


 

  于辚辚车声中,于瘦湖沙堤旁,于亭台烟雨里,于连亘*上——中国悠久历史、深远文化、多元民族、蓬勃生命,已然瓜瓞绵延了千载暑寒春秋。

  蔡候纸承载着的它们,递交给了千年后的我们。我们用电信号将这些信息永久的镌刻在了历史长卷上,寄放在了8比特的存储单元中,又递交给了,无限的未来。

 


 
 
 
 
 
 

unicode

意为universal,是字符集的大一统者。

世界上国家与民族众多,如果每种语言都像DBCS那样无情的砍掉ASCII的一部分,并不断向后追加字符…这是一件可怕的事情

因而unicode应运而生。
 
unicode是一个字符集(Character set)。也仅仅是一个字符集它实现了二进制代码(通常用16进制表示)与字符的一一对应。

数字与字符双向唯一的映射。(
 

下面给出一句我们获取曾经奉为真理的话,现在我们要彻彻底底的推翻它:

对于unicode码,每个字母、数字、符号,甚至中文,全部都占两个字节。

unicode仅仅是一个字符集,仅仅提供映射关系。至于怎样编码,如何占用字节…这与unicode毫无关系 记住,毫无关系。

因此,这句话的语境从根本上就是一个极其错误的认知。
 

事实上,在unicode字符集出现后的很长一段时间内,unicode的实现方式是极其混乱的——数字与字符的映射虽然已经统一,但这个数字如何分配字节去存储?读取的时候又如何知道几个字节对应一个字符呢?

这是与unicode字符集完全不同层次的概念:unicode的实现方式,也称为编码方案
 
 
unicode的实现方式

UTF-8
 

Unicode编码(十六进制) UTF-8 字节流(二进制)
000000-00007F 0xxxxxxx
000080-0007FF 110xxxxx 10xxxxxx
000800-00FFFF 1110xxxx 10xxxxxx 10xxxxxx
010000-10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

不难看出UTF-8编码的特点:对不同范围的字符使用不同长度的编码。这也被称之为字节变长编码

UTF-8存储字符,也就是存储字符映射的数字时,可以是1, 2, 3, 4字节长度

一般来说,欧洲字符1~2个字节,亚洲字符3个字节,附加字符4个字节
 

UCS-2

UCS-2中,所有字符都是严格的16位长度,也就是所有字符长度都为2字节

极具误导性的狭义unicode,就是指的unicode的UCS-2实现方式注意
 

UTF-16

UTF-16是UCS-2中缺少的附加字符的补充。也就是说,是UCS-2的严格父集。

UTF-16中的字符是严格的16位或32位,也就是说,UTF-16的字符长度为严格的2字节或4字节

 
 

还有一个常见的认知错误:

unicode码只能表示65536个字符

这个错误认知的可怕之处在于,与"unicode所有字符都是2字节"完成了惊人而荒唐的自洽:2^16 = 65536

首先,unicode只是个字符集,说它的字符都占2个字节本来就是根本的认知错误;另外,unicode可以映射的字符,也远远不止65536个:

Unicode 目前规划的总空间是17个平面(平面0至16),0x0000 至 0x10FFFF。每个平面有 65536 个码点

17个平面中,基本多文种平面(Basic Multilingual Plane,BMP,也就是第0平面)最为常见与重要

BMP平面内的字符,用utf-8方式实现,则占1~\3字节;用utf-16实现,则全部占2个字节;
超出BMP的部分(辅助平面的附加字符),无论是utf-8还是utf-16,都是占4字节

 

 

 

 
 
 
 

 
 
 

【图文】有趣、通俗、严谨地解释ASCII、DBK、unicode、utf-8的区别(建议收藏)