编码认识(GBK,GB2312,GB18030,US-ASCII,Unicode,UFT-8,UFT-16,UFT-32)

编码

最近在写程序时候老出现中文乱码,查了下是编码标准没整对 = w =、虽然很简单就解决了问题,但是对编码产生了兴趣,就翻了翻,咳咳发现还真不少,这里只介绍了知名度比较高的。

先来张思维导图今天介绍的主要就是这些编码了:
1.png

先说说中国的吧、中国的第一个编码是 GB2312 里面包含了汉字。。。对只有汉字,简单的说就是外国编码没有汉字或者搞得很不好用 = = 然后中国就出了个,不过只有繁体的..... 然后很快 1995 年又出现了新生儿,GBK 没错·,简体中文来了,简体中文来了!哇卡卡卡!不过这还不够,我们 56 个民族 56 朵花,怎么能少了少数民族。。。不!是其他民族的文字呢!所以伟大的 GB18030 就蹦出来了!出生于 2000 年 3 月 17 日,夜 = =

自从计算机发展以来无人不知 ASCII、又叫 US-ASCII 美国人发明的嘛 = = 加了个 US 来强调?!美国标注信息交换代码、几乎在所有类型计算机上都是标准的 128 字符集,后来经过扩展了 128 个字符集、扩展之后又叫 IBM 字符集 = =

Unicode 编码 1994 年公布 = =、又称万国码,简单的说,他的使命就是表示各个国家的各种文字,每个文字都有唯一的表示码、简单地说就是解决了全国文字沟通问题 = =

番外篇

1,GB2312 是很老的东西了,早就发现不够用了。

2,94 年(还是之前)国家推出了建议性标准 gb13000,这个标准其实就是 utf-8 标准(除了名字,完全一样),同时也建议微软公司采纳。--(据说是 1993 年,GB13000,应该是 ISO10646)

3,微软借口说 gb18000 还不成熟,为了取得中国市场的垄断地位,自己搞了一套汉字标准,于是它就随着 win95 和 office 之类的流行起来了,国家看生米已经煮成了熟饭,只好把这套标准定为国标 GBK 标准。--(其实只是指导性标准,并非强制性,GB18030 是强制性标准)

4,微软到了 99 年(前后吧),又说 GBK 已经落伍了,现在流行 utf-8 标准,准备全盘转换成 utf-8,这些把有关部门惹怒了。NND,当年我们推 utf-8 你说不成熟,自己搞了一套,现在赚得盆满钵满了又自己说要推 utf-8 了,你丫微软分明就没把政府放在眼里。

5,于是政府怒了,强制推行 gb18030 标准(这个标准前面兼容 GBK,其他码位兼容 utf-8),算是过渡标准吧。要求微软强制执行,否则产品不得在大陆买。于是基本搞死了微软的 WindowsMe,差点搞死了 Office2000(据说发行前几个月,微软除了改字符编码就没干其他什么事情)--(确实,WinMe 是我认为的最差的 Windows 版本,而 office2k 也是前不着村,后不着店,前后兼容性都差)

6,由于以上历史原因,现在就是 GB2312,GBK,GB18030,UTF-8 并存了。

7,如果不是万恶的微软,我们早就用上 UTF-8 了。

8,所以说微软和政府关系一直很僵,不是说着玩的,微软太目中无政府了。

9,以上是我从其他地方看来的,可能记得不是太真切了,说的不对请大家指正。

兼容关系

2.png

表格整理

编码标准发明时间发明国家作用内容简介
ISO-8859-1找不到?各种外文8 位字符集,
兼容 ASCII
GB23121980 年发布中国繁体GB2312 编码适用于汉字处理、汉字通信等系统之间的信息交换,通行于中国大
陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都
支持 GB 2312。
GBK1995 年 12 月 15 日发布中国繁体,简体GBK 向下与 GB 2312 编码兼容,向上支持 ISO 10646.1 国际标准,是前者向后
者过渡过程中的一个承上启下的产物。
GB180302000 年 3 月 17 日发布中国繁体,简体,中国各少数民族民族文字我国自主研制的以汉字为主并包含多种我国少数民族文字(如藏、蒙古、傣、彝、
朝鲜、维吾尔文等)的超大型中文编码字符集强制性标准
US-ASCII根据资料来看应该很早美国标准信息交换代码数字 / 英文二进制 / 十六进制 / 用 01 表示数字和英文字母
(电脑)最基本的标准字符集,ASCII 是“美国信息交换标准码”的英文缩写
(American Standard Code for Information Interchange),ASCII 字符集包含
128 个字符(7bits),它在几乎所有类型的计算机上都是标准的,每个 ASCII 字符
使用一个字节表示,其取值范围在 0 至 127 之间,ASCII 扩展字符集又称为 IBM 字符
集,它在 ASCII 字符集的基础上,又定义了 128 个字符,取值范围在 128 至 255 之
间,充分利用了一个字节所能表达的最大信息,Siebenbitcode
Unicode1990 年开始研发,1994 年正式公布?能够使计算机实现跨语言、跨平台的文本转换及处理。跨平台,每个国家的每种语言的每个文字都有编码,为解决编码统一、各个国家编码不相同,不兼容的问题,扩展自 ASCII,Unicode 是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。Unicode 用数字 0-0x10FFFF 来映射这些字符,最多可以容纳 1114112 个字符,或者说有 1114112 个码位。码位就是可以分配给字符的数字。UTF-8、UTF-16、UTF-32 都是将数字转换到程序数据的编码方案。在 Unicode 中:汉字“字”对应的数字是 23383(十进制),十六进制表示为 5B57。在 Unicode 中,我们有很多方式将数字 23383 表示成程序中的数据,包括:UTF-8、UTF-16、UTF-32。UTF 是“UCS Transformation Format”的缩写,可以翻译成 Unicode 字符集转换格式,即怎样将 Unicode 定义的数字转换成程序数据。例如,“汉字”对应的数字是 0x6c49 和 0x5b57,而编码的程序数据是:
char data_utf8[]={0xE6,0xB1,0x89,0xE5,0xAD,0x97};//UTF-8 编码
char16_t data_utf16[]={0x6C49,0x5B57}; //UTF-16 编码
char32_t data_utf32[]={0x00006C49,0x00005B57};//UTF-32 编码
这里用 char、char16_t、char32_t 分别表示无符号 8 位整数,无符号 16 位整数和无符号 32 位整数。UTF-8、UTF-16、UTF-32 分别以 char、char16_t、char32_t 作为编码单位。
UFT-8由 Ken Thompson 于 1992 年创建美国计算机学者 Ken ThompsonUTF-8 编码可以通过屏蔽位和移位操作快速读写。基于 Unicode,外文名
8-bit Unicode Transformation Format
Unicode 转换格式
UFT-16Unicode 扩展对每一个 Unicode 码位使用恰好 16 位元UTF-16 是 Unicode 的其中一个使用方式。 UTF 是 Unicode Translation
Format,即把 Unicode 转做某种格式的意思。
即把 Unicode 字符集的抽象码位映射为 16 位长的整数(即码元)的序列,用于数
据存储或传递。Unicode 字符的码位,需要 1 个或者 2 个 16 位长的码元来表示,因
此这是一个变长表示。
(是高字节在前还是低字节在前)由流中的前两字节中字节顺序标记来确定
UFT-16BEUnicode 扩展与 UFT-16 字节顺序不同
(最低地址存放高位字节,符合人们的阅读习惯)字节顺序
只有 UTF-16,即只有使用 Unicode 编码存储或传递时,才涉及到高字节还是低字
节序的问题,UTF-8 一般是没有字节序的概念的,因为 utf-8 编码本身中就已含有
了编解码转换方式了。
UFT-16LEUnicode 扩展与 UFT-16 字节顺序不同
(最高地址存放高位字节)字节顺序
UFT-32Unicode 扩展对每一个 Unicode 码位使用恰好 32 位元UTF-32 (或 UCS-4) 是一种将 Unicode 字符编码的协定,对每一个 Unicode 码位使
用恰好 32 位元。其它的 Unicode transformation formats 则使用不定长度编码。
因为 UTF-32 对每个字符都使用 4 字节,就空间而言,是非常没有效率的。特别
地,非基本多文种平面的字符在大部分文件中通常很罕见,以致于它们通常被认
为不存在占用空间大小的讨论,使得 UTF-32 通常会是其它编码的二到四倍。虽然
每一个码位使用固定长定的字节看似方便,它并不如其它 Unicode 编码使用得广
泛。