编码认识(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
GB2312 1980 年发布 中国 繁体 GB2312 编码适用于汉字处理、汉字通信等系统之间的信息交换,通行于中国大
陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都
支持 GB 2312。
GBK 1995 年 12 月 15 日发布 中国 繁体,简体 GBK 向下与 GB 2312 编码兼容,向上支持 ISO 10646.1 国际标准,是前者向后
者过渡过程中的一个承上启下的产物。
GB18030 2000 年 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
Unicode 1990 年开始研发,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 Thompson UTF-8 编码可以通过屏蔽位和移位操作快速读写。 基于 Unicode,外文名
8-bit Unicode Transformation Format
Unicode 转换格式
UFT-16 Unicode 扩展 对每一个 Unicode 码位使用恰好 16 位元 UTF-16 是 Unicode 的其中一个使用方式。 UTF 是 Unicode Translation
Format,即把 Unicode 转做某种格式的意思。
即把 Unicode 字符集的抽象码位映射为 16 位长的整数(即码元)的序列,用于数
据存储或传递。Unicode 字符的码位,需要 1 个或者 2 个 16 位长的码元来表示,因
此这是一个变长表示。
(是高字节在前还是低字节在前)由流中的前两字节中字节顺序标记来确定
UFT-16BE Unicode 扩展 与 UFT-16 字节顺序不同
(最低地址存放高位字节,符合人们的阅读习惯)字节顺序
只有 UTF-16,即只有使用 Unicode 编码存储或传递时,才涉及到高字节还是低字
节序的问题,UTF-8 一般是没有字节序的概念的,因为 utf-8 编码本身中就已含有
了编解码转换方式了。
UFT-16LE Unicode 扩展 与 UFT-16 字节顺序不同
(最高地址存放高位字节)字节顺序
UFT-32 Unicode 扩展 对每一个 Unicode 码位使用恰好 32 位元 UTF-32 (或 UCS-4) 是一种将 Unicode 字符编码的协定,对每一个 Unicode 码位使
用恰好 32 位元。其它的 Unicode transformation formats 则使用不定长度编码。
因为 UTF-32 对每个字符都使用 4 字节,就空间而言,是非常没有效率的。特别
地,非基本多文种平面的字符在大部分文件中通常很罕见,以致于它们通常被认
为不存在占用空间大小的讨论,使得 UTF-32 通常会是其它编码的二到四倍。虽然
每一个码位使用固定长定的字节看似方便,它并不如其它 Unicode 编码使用得广
泛。