ANSI,GBK,UTF-8,UTF-16LE,UTF-16BE
2010-08-23 18:35
ANSI
不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种
汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下, ANSI 编码代表 GB2312 编码,在日文操作系统下, ANSI 编码代表 JIS 编码。
不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中
在Ansi 上各国对 ascii 码都进行庞大的互不兼容 的扩充,大陆对 Ansi 的扩充是 ascii->GB2312( 简体中文 )->GBK( 繁体中文 )->GB18030( 加了少
数民族语 言) ,台湾对 Ansi 的扩充是 ascii->BIG5 , GB2312 和 BIG5 互不兼容。
GBK
GBK编码 (Chinese Internal Code Specification) 是中国大陆制订的、等同于 UCS 的新的中文编码扩展国家标准。 gbk 编码能够用来同时
表示繁体字和简体字,而gb2312 只能表示简体字, gbk 是兼容 gb2312 编码的。 GBK 工作小组于 1995 年 10 月,同年 12 月完成 GBK 规范。该编码标准
兼容GB2312 ,共收录汉字 21003 个、符号 883 个,并提供 1894 个造字码位,简、繁体字融于一库。
iso8859-1
属于单字节编码,最多能表示的字符范围是0-255 ,应用于英文系列。比如,字母 'a' 的编码为 0x61=97 。
很明显,iso8859-1 编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很
多时候,仍旧使用iso8859-1 编码来表示。而且在很多协议上,默认使用该编码。
BIG5编码
是目前台湾、香港地区普遍使用的一种繁体汉字的编码标准,包括440 个符号,一级汉字 5401 个、二级汉字 7652 个,共计 13060 个汉字。
BIG5又称大五码或五大码, 1984 年由台湾财团法人信息工业策进会和五间软件公司宏碁 (Acer) 、神通 (MiTAC) 、佳佳、零壹 (Zero One) 、
大众 (FIC) 创立,故称大五码。 Big5 码的产生
UTF-8
UTF:UCS Transformation Format.考虑到 unicode 编码不兼容 iso8859-1 编码,而且容易占用更多的空间:因为对于英文字母, unicode 也
需要两个字节来表示。所以unicode 不便于传输和存储。因此而产生了 utf 编码, utf 编码兼容 iso8859-1 编码,同时也可以用来表示所有语言
的字符,不过,utf 编码是不定长编码,每一个字符的长度从 1-6 个字节不等。另外, utf 编码自带简单的校验功能。一般来讲,英文字母都是
用一个字节表示,而汉字使用三个字节。
UTF-16LE UTF-16BE
big endian和 little endian 是 CPU 处理多字节数的不同方式。例如 “ 汉 ” 字的 Unicode 编码是 6C49 。那么写到文件里时,究竟是将 6C 写在
前面,还是将49 写在前面?如果将 6C 写在前面,就是 big endian 。如果将 49 写在前面,就是 little endian 。
“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头 (Big-Endian) 敲开还是从小头 (Little-Endian) 敲开,由
此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。
我们一般将endian 翻译成 “ 字节序 ” ,将 big endian 和 little endian 称作 “ 大尾 ” 和 “ 小尾 ” 。
Unicode(UCS)
Unicode编码后的大小是一样的 . 例如一个英文字母 "a" 和 一个汉字 " 好 " ,编码后都是占用的空间大小是一样的,都是两个字节
Unicode可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。所以可以说它是不兼容 iso8859-1 编
码的,也不兼容任何编码。不过,相对于iso8859-1 编码来说, uniocode 编码只是在前面增加了一个 0 字节,比如字母 'a' 为 "00 61" 。
需要说明的是,定长编码便于计算机处理(注意GB2312/GBK 不是定长编码),而 unicode 又可以用来表示所有字符,所以在很多软件内部是使
用unicode 编码来处理的,比如 java 。
在实际应用中UTF-16BE 的编码内容正好和 UNICODE 高低位相反,而 UTF-16LE 与 UNICODE 的编码内容完全一致。