1.ASC II
ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统。ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。后128个称为扩展ASCII码。许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展ASCII 码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号。
2.ANSI
ANSI是一种字符代码,为使计算机支持更多语言,通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符。在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码;在繁体中文Windows操作系统中,ANSI编码代表Big5。
3.GB2312 GBK GB18030
GB2312
一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE。
GBK
两个字节表示一个汉字,英文占一个字节,即全角半角。不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。结果扩展之后的编码方案被称为 GBK 标准,GBK 包括了 GB2312 的所有内容,同时又增加了近20000个新的汉字。
GB18030
GB18030 编码是一二四字节变长编码。GB 18030与GB 2312-1980完全兼容,与GBK基本兼容,支持GB 13000及Unicode的全部统一汉字,共收录汉字70244个。单字节,其值从0到0x7F,与 ASCII 编码兼容。双字节,第一个字节的值从0x81到0xFE,第二个字节的值从0x40到0xFE(不包括0x7F),与 GBK标准基本兼容。四字节,第一个字节的值从0x81到0xFE,第二个字节的值从0x30到0x39,第三个字节从0x81到0xFE,第四个字节从0x30到0x39。
4.Unicode
Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
固定用两个字节来表示,其中英文高字节补0
5.UTF-8
UTF-8以字节为单位对Unicode进行编码,UTF-8是Unicode的实现方式之一。
UTF8就是每次8个位传输数据,而UTF16就是每次16个位,只不过为了传输时的可靠性,从UNICODE到UTF时并不是直接的对应,而是要过一些算法和规则来转换。
TF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
UTF-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
下表总结了编码规则,字母x表示可用编码的位。
Unicode编码(十六进制) UTF-8 字节流(二进制)
00000000 - 0000007F 0xxxxxxx
00000080 - 000007FF 110xxxxx 10xxxxxx
00000800 - 0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
00010000 - 001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
UTF-8编码的最大长度是6个字节。从上表可以看出,6字节模板有31个x,即可以容纳31位二进制数字。Unicode的最大码位0x7FFFFFFF也只有31位。
“汉”字的Unicode编码是0x6C49。0x6C49在0x0800-0xFFFF之间,使用用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将0x6C49写成二进制是:0110 1100 0100 1001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。
6.Little endian和Big endian
Unicode编码存储时,第一个字节在前,就是”大头方式“(Big endian),第二个字节在前就是”小头方式“(Little endian)。Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做”零宽度非换行空格“(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。这正好是两个字节,而且FF比FE大1。如果一个文本文件的头两个字节是FE FF,就表示该文件采用大头方式;如果头两个字节是FF FE,就表示该文件采用小头方式。
7.实例
新建一个文本文件,内容就是一个”汉“字,依次采用ANSI,Unicode,Unicode big endian 和 UTF-8编码方式保存。
然后,用文本编辑软件UltraEdit中的”十六进制功能“(Ctrl + H),观察该文件的内部编码方式。
1)ANSI:文件的编码就是两个字节“BA BA”,这正是“汉”的GB2312编码,这也暗示GB2312是采用大头方式存储的。
2)Unicode:编码是四个字节“FF FE 49 6C”,其中“FF FE”表明是小头方式存储,真正的编码是6C 49。
3)Unicode big endian:编码是四个字节“EF FF 6C 49”,其中“FE FF”表明是大头方式存储。
4)UTF-8:编码是六个字节“EF BB BF E6 B1 89”,前三个字节“E6 B1 89”表示这是UTF-8编码,后三个“E6 B1 89”就是“汉”的具体编码,它的存储顺序与编码顺序是一致的。
再在"汉"字后面加上一个英文字母a,a的ASC II码为61H,依次采用ANSI,Unicode,Unicode big endian 和 UTF-8编码方式保存。
1)ANSI:文件的编码就是两个字节“BA BA 61”,这正是“汉”的GB2312编码,这也暗示GB2312是采用大头方式存储的。
2)Unicode:编码是四个字节“FF FE 49 6C 61 00”,其中“FF FE”表明是小头方式存储,真正的编码是6C 49。
3)Unicode big endian:编码是四个字节“EF FF 6C 49 00 61”,其中“FE FF”表明是大头方式存储。
4)UTF-8:编码是六个字节“EF BB BF E6 B1 89 61”,前三个字节“E6 B1 89 61”表示这是UTF-8编码,UTF-8是一种变长的编码方式,所以c的ASC II码为61H,高字节不再补0。
再在‘a’的后面加上±,其扩展ASC II码为F1,依次采用ANSI,Unicode,Unicode big endian 和 UTF-8编码方式保存。
1)ANSI:文件的编码就是两个字节“BA BA 61 A1 C0”,这正是“汉”的GB2312编码,这也暗示GB2312是采用大头方式存储的。
2)Unicode:编码是四个字节“FF FE 49 6C 61 00 B1 00”,其中“FF FE”表明是小头方式存储.
3)Unicode big endian:编码是四个字节“EF FF 6C 49 00 61 00 B1”,其中“FE FF”表明是大头方式存储。
4)UTF-8:编码是六个字节“EF BB BF E6 B1 89 61 C2 B1”,前三个字节“E6 B1 89 61”表示这是UTF-8编码.
所以,根据结果来看,GBK Unicode UTF-8不再兼容扩展ASC II码,另根据其Unicode编码为’00 B1‘ 即:‘1011 0001’
将其转化为UTF-8,根据其属于
00000080 - 000007FF 110xxxxx 10xxxxxx 故将其自右向左一次填满,不足补0,即为‘1100 0010 1011 0001’转化为16进制就是:‘C2 B1‘就是它的UTF-8码
参考:http://blog.csdn.net/lvxiangan/article/details/8151670