ANSI编码并不是某一特定编码,与系统环境区域有关,有中文区域环境下是GBK编码,在英文区域环境下是ASCII编码。为了使打算机支持多种措辞,不同的国家和地区制订了不同的标准,由此产生了 GB2312, BIG5, JIS 等编码标准。利用 2 个字节来代表一个字符的各种延伸编码办法,称为 ANSI 编码。在简体中体裁系下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。
1,ASCII:每个字母或符号占1Byte(8bits),并且8bits的最高位是0,对英语字符与二进制位之间的关系做了统一规定,这被称为 ASCII 码。ASCII编码一共规定了128个字符的编码,比如空格SPACE是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的掌握符号),只占用了一个字节的后面7位,最前面的一位统一规定为0。有一些编码把8bits最高位为1的后128个值也编码上,1Byte可以表示256个值,这属于扩展的ASCII,并非标准ASCII,常日所说的标准ASCII只有前128个值。
ASCII码表
2,GB2312、GBK、GB18030编码:GB全称GuoBiao国标,GBK全称GuoBiaoKuozhan国标扩展。GB18030编码兼容GBK,GBK兼容GB2312。
GB2312:最早一版的中文编码,每个字霸占2Bytes,由于要和ASCII兼容,那这2Bytes最高位不可以为0了(ASCII有冲突),在GB2312中收录了6763个汉字以及682个分外符号。
GBK:由于GB2312只有6763个汉字,于是GBK在反面GB2312、ASCII冲突(即兼容GB2312和ASCII)的条件下,用每个字霸占2Bytes的办法又编码了许多汉字,表示的汉字达到了20902个,另有984个汉语标点符号、部首等。值得把稳的是这20902个汉字还包含了繁体字,但是该繁体字与台湾Big5编码不兼容。
GB18030:GBK只用2Bytes表示一个字已经不足(2Bytes最多只有65536种组合,然而为了和ASCII兼容,最高位不能为0)。多出来的汉字利用4Bytes编码。我国在2000年和2005年分别颁布的两次GB18030编码,个中2005年的是在2000年根本上进一步补充。GB18030编码的中文有七万多个汉字了,乃至包含了少数民族笔墨。GBK和GB2312是2Bytes,GB18030比GBK多出来的字是4Bytes。
3,Latin1编码(ISO-8859-1编码):在ASCII根本上又充分利用了后面那128个值,是单字节编码办法,最多只能表示256个字母或符号,并且前128个和ASCII完备吻合,将1个字节的256个值全部占满了。
ISO-8859-1
4,Unicode:称为单一码,将天下上所有国家的字符编码进行统一的编码,编码范围是 0x0000 - 0x10FFFF。Unicode是一个字符集,给所有的字符分配一个码值,只规定了每个符号的二进制值。Unicode 只是字符集码点,而UTF-8、UTF-16、UTF-32 才是真正的字符编码规则。
5,UTF-8(8bit Unicode Transformation Format):是一种变长的编码办法,利用1~4个字节表示一个符号,根据不同的符号而变革字节长度。UTF-8 编码如果一个字节的第一位是0,则这个字节单独便是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。对付英语字母,UTF-8 编码和 ASCII 码是相同的。
utf-8编码
6,UTF-16编码:也是一种变长字符编码,将字符编码成2字节或者4字节。对付 Unicode 码小于 0x10000 的字符,利用 2 个字节存储,并且是直接存储 Unicode 码,不用进行编码转换;对付 Unicode 码在 0x10000 和 0x10FFFF 之间的字符,利用 4 个字节存储,这 4 个字节分成前后两个字节,前面两个字节的前 6 位二进制固定为 110110,后面两个字节的前 6 位二进制固定为 110111, 前后部分各剩余 10 位二进制表示符号的 Unicode 码 减去 0x10000 的结果;大于 0x10FFFF 的 Unicode 码无法用 UTF-16 编码。
7,UTF-32:每个码点都用4字节进行存储,存储的便是unicode对应的值,没有进行编码直接存储的
8,UTF-8、UTF-16、UTF-32 之间转换:UTF-8、UTF-16、UTF-32 是 Unicode 码表示身分歧的二进制格式的编码规则,反之,通过这三种编码的数据,也能得到相对应的 Unicode 码,有Unicode 码,按照 UTF-8、UTF-16、UTF-32 的编码方法就能转换成任一种编码。
注:Unicode属于字符集,不属于编码,UTF-8、UTF-16等是针对Unicode字符集的编码。
附:Little endian 和 Big endian:存储第一个字节在前Big endian,第二个字节在前便是Little endian。UCS-2 (Universal Character Set codeed in 2 octets)格式可以存储 Unicode 码。Unicode 规范定义,每一个文件的最前面加入一个表示编码顺序的字符,这个字符叫做"零宽度非换行空格"(zero width no-break space),用FEFF表示,如果一个文本文件的头两个字节是FE FF,就表示该文件采取Big endian办法;如果头两个字节是FF FE,就表示该文件采取Little endian办法。
BOM:BOM(byte order mark)是为 UTF-16 和 UTF-32 准备的,用于标记字节序(byte order)。UTF-8 不须要 BOM,只管 Unicode 标准许可在 UTF-8 中利用 BOM,不含 BOM 的 UTF-8 才是标准形式。UTF-8和带BOM的UTF-8的差异便是有没有 BOM,即文件开头有没有 U+FEFF。UTF-8 的网页代码不应利用 BOM,否则常常会出错。