1、1,补充:编码知识,1、 ASCIIASCII是“美国信息交换标准编码”的英文字头缩写,可称之为“美标”。美标规定了用从0到127的128个数字来代表信息的规范编码(最高位为0),其中包括33个控制码,一个空格码,和94个形象码。形象码中包括了英文大小写字母,阿拉伯数字,标点符号等。美标是国际上大部分大小电脑的通用编码。,2、 Binary 由于美标只规定了128个编码,剩下的另外128个数码(最高位为1)没有规范,各家用法不一。另外美标中的33个控制码,各厂家用法也不尽一致。这样我们在不同电脑间交换文件的时候,就有必要区分两类不同的文件。第一类文件中每一个字都是美标形象码或空格码。这类文件称
2、为“美标文本文件”(ASCII Text Files),或略为“文本文件”,通常可在不同电脑系统间直接交换。第二类文件,也就是含有控制码或非美标码的文件,通常不能在不同电脑系统间直接交换。这类文件有一个通称,叫“二进制文件”(Binary Files)。,电脑中的一个字符大都是用一个八位数(字节)的二进制数字表示。这样一个字节可表示256个不同字符。,2,3、ANSI编码ASCII可被扩展,最优秀的扩展方案是ISO 8859-1,通常称之为Latin-1,它包括了足够的附加字符集来显示基本的西欧语言。这些优秀的扩展方案最后以ANSI(美国国家标准协会American National Stan
3、dards Institute)标准的形式形成文件。在ANSI标准中,低端的128个编码与ASCII一致,但根据所在国籍的不同,处理编码128以上的字符有许多不同的方式。,4、DBCS/MBCS亚洲国家的字符表有成千上万个字符,这样的字符表是用8位二进制无法表示的。该问题的解决通常有赖于称为DBCS/MBCS(double/Multi byte character set,双/多字节字符集),3,(1)国标码(GB2312-1980年 )“国标”是“中华人民共和国国家标准信息交换用汉字编码”的简称。国标表把七千余汉字及其它字符排成一个94行、94列的方阵。例如“中”字在方阵中处于第区(行)第8
4、位(列),它的区位码就是5448。,(2) GBK -1995年(GB码的扩展字符编码 )GB2312支持的汉字太少。汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。,(3) GB18030 -2000年取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。,(4)繁体中文编码Big5: 这是繁体中文标准。CNS11643: 台湾的官方标准繁体中文编码。ISO2022CN_CNS: 编码中文(繁体)的一套标准。MS950或Cp950: ASCII + Big5,用于台湾和 香港的
5、繁 体中文 MS Windows操作系统。,测试:http:/172.20.1.83:8080/testjsp/ch04/setCharset.jsp,4,5、Unicode 与 ISO 10646,(1)以往MBCS的缺陷为了兼容ASCII的变长编码来给程序员带来了不小的麻烦,因为每当设计到DBCS字符串的处理时,总是要判断当中的一个字节到底表示的是一个字符还是半个字符。另外各个国家的编码规范不统一,给信息交流和传输带来很大的困难。由此可见DBCS并不是一种非常好的解决方案。 人们在不断寻找这更好的字符编码方案,于是Unicode诞生了。(2)发展历史为了 i18n(Internationa
6、lization ) ,出现了两个针对全人类所有字符的编码字符集:一个是 UCS ( Universal Character Set ) ,它是国际标准化组织弄出来的,也就是 ISO/IEC 10646 ;另一个是 Unicode ( Universal Code ) , Unicode 同时也是一个联盟的名字,也就是 HP 、 Microsoft 、 IBM 、 Apple 等几家知名的大型计算企业所组成的联盟集团,他们为了推进多种文种的统一编码而制定出了 Unicode 。 目前Windows以及java的内核已经采用Unicode编码,这样在内核上可以支持全世界所有的语言文字,5,(3)
7、版本Unicode 1991年发布1.0版本, ISO/IEC10646.1于1993年发布。从Unicode2.0(1997)开始,两个组织将 Unicode 和 UCS 进行统一,也就是把 Unicode 并入ISO10646 ,成为它的一个子集。 Unicode协会现在的最新版本是2008年的Unicode 5.1。ISO的最新标准是ISO/IEC 10646:2008 (4)两种规范国际标准 ISO 10646 定义了 通用字符集 (Universal Character Set, UCS)。它有两种规范 :UCS-2,也就是每个字符占用2个字节。这样理论上一共最多可以表示 216 即
8、 65536 个字符。UCS-4,理论上最多能表示 231 个字符,完全可以涵盖一切语言所用的符号。(5)与gbk的区别在Unicode里,所有的字符被一视同仁。例如一个英文字母 “a” 和 一个汉字 “好”,编码后都是占用的空间大小是一样的,都是两个字节!汉字不再使用“两个扩展ASCII”,而是使用“1个Unicode”,注意,现在的汉字是“一个字符”了,于是,拆字、统计字数这些问题也就自然而然的解决了。,6、UTF编码,Unicode可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。所以可以说它是不兼容ISO-8859-1编码的,也不兼容以往任何编码,而且
9、不利于传输和保存(占空间)。于是1993年开始提出了UTF(UCS Transf-ormation Format即 UCS转换格式 )它是将Unicode编码规则和计算机的实际编码对应起来的一个规则。现在流行的UTF有2种:UTF-8和UTF-16。,7,UTF-16和Unicode本身的编码规范是一致的UTF-8不同,它定义了一种“区间规则”,这种规则可以和ASCII编码保持最大程度的兼容。它将Unicode编码为00000000-0000007F的字符,用单个字节来表示; 00000080-000007FF的字符用两个字节表示 00000800-0000FFFF的字符用3字节表示,8,7、
10、其它几个名词,(2)charset 字符集,顾名思义是字符的集合,它包括了一系列字符,并对每个字符设置了相应的编号(注意,编号不一定是最终的编码即计算机内码)。 (3)encoding 编码,与字符集相对应的储存和传输的编码格式,它会将字符集中的每个字符储存为相应的二进制字节。编码与解码总是呼应的,即一个编码方式同时也包含了将字符从二进制编码中还原的使命。不过很多时候我们说的编码包含了字符集的概念,说的字符集包含了编码的概念 ,例如Unicode编码或则Unicode字符集。,(1)代码页(Cp)代码页全称是Code Page,是字符集编码的别名, 早期IBM和微软内部使用特别数字(932-日
11、文、936-简体中文(GBK)、949-韩文、950 -繁体中文)来标记这些编码,其实大多的这些编码已经有自己的名称了。Windows(2000/xp)内码为Unicode之后,代码页是从系统内码表到相应编码的映射表,比如 MS936 就是从 Unicode 到 GBK 的映射表。,9,(4)Big Endian和Little Endian上面提到了一个字符可能占用多个字节,那么这多个字节在计算机中如何存储呢?实际上两者都有可能,并分别有不同的名字。如果存储为 AB CD,则称为Big Endian;,如果存储为 CD AB,则称为Little Endian。,10,(5)字节序标记BOMUn
12、icode规范中推荐的标记字节顺序的方法是BOM。BOM(Byte Order Mark)如果文件开头使用了FEFF或FFFE,win系统认为 UNICODE编码,否则为ANSI或UTF-8编码,然后继续分析,如果一个字节大于127,就证明这个字节与后面的字节组成了一个汉字。EF BB BF UTF-8 FE FF UTF-16/UCS-2, little endian FF FE UTF-16/UCS-2, big endian FF FE 00 00 UTF-32/UCS-4, little endian. 00 00 FE FF UTF-32/UCS-4, big-endian.,11,8、国际国内编码演进图,http:/