编码认识(GBK,GB2312,GB18030,US-ASCII,Unicode,UFT-8,UFT-16,UFT-32)
编码
最近在写程序时候老出现中文乱码,查了下是编码标准没整对 = w =、虽然很简单就解决了问题,但是对编码产生了兴趣,就翻了翻,咳咳发现还真不少,这里只介绍了知名度比较高的。
先来张思维导图今天介绍的主要就是这些编码了:
先说说中国的吧、中国的第一个编码是 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,以上是我从其他地方看来的,可能记得不是太真切了,说的不对请大家指正。
兼容关系
表格整理
编码标准 | 发明时间 | 发明国家 | 作用内容 | 简介 |
---|---|---|---|---|
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 编码使用得广 泛。 |