一、概念
字符(Character):各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
字节(Byte):计算机信息技术用于计量存储容量的一种计量单位,也表示一些计算机编程语言中的数据类型和语言字符。
字符串(string):一个连续的字符序列,在存储上类似于字符数组。
字符集(Character Set):多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同。
字符编码(Character encoding):也称字集码,是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。
单字节字符集(Single Byte Character Set, SBCS):所有字符都只用一个字节表示。用一个字节表示的0来标志SBCS字符串的结束。
多字节字符集(Multi-Byte Character Set, MBCS):部分字符用一个字节表示,部分字符用两个或更多字节表示。Windows中的MBCS包含两种字符,单字节字符(Single-Byte Characters)和双字节字符(Double-Byte Characters)。有一些特定的值被保留用来表明它们是双字节字符的一部分。MBCS字符串也使用单字节的0来标志字符串结束。
Unicode字符集:通常又称为宽字符集(Wide Character Set),所有字符都用两个字节来表示。 注意,不要混淆Unicode字符集与MBCS,Unicode字符串采用两个字节表示的0作为结束标志。
二、常见字符集及字符编码
ASCII
● ASCII(American Standard Code for Information Interchange,美国信息互换标准编码)是基于罗马字母表的一套电脑编码系统。
● 包含了英文大小写字符、阿拉伯数字和西文符号等可显示字符以及回车键、退格、换行键等控制字符。
● 主要用于显示现代英语和其他西欧语言,是现今最通用的单字节编码系统,并等同于国际标准ISO 646。
● 基本字符集采用7位(bits)表示一个字符,共128个字符,字符值从0到127,其中32到126是可打印字符。
● 扩展字符集采用8位(bits)表示一个字符,共256个字符,增加了表格符号、计算符号、希腊字母和特殊的拉丁符号,可以表示更多的欧洲常用字符。
ANSI(GB2312, GBK, Big5, GB18030)
1.GB2312
GB2312是一个简体中文字符集,使用二维矩阵编码法对所有字符进行编码,采用两个字节表示一个汉字。
2.GBK
GBK是GB2312的扩展,K为扩展的汉语拼音中“扩”字的声母。
字符有一字节和双字节编码,一字节和ASCII保持一致。
3.Big5
Big5又称为大五码或五大码,是一种繁体字编码,主要在台湾、香港和澳门等使用繁体字的地区使用,采用双字节表示一个字符。
4.GB18030
● GB18030是我国目前最新的变长多字节字符集,兼容GB2312、GBK以及Unicode3.1。
● 采用变长多字节编码,每个字可以由1个、2个或4个字节组成。
● 编码空间庞大,最多可定义161万个字符。
● 支持中国国内少数民族文字,不需要动用造字区。
● 汉字收录范围包含繁体汉字以及日韩汉字。
● GB18030包含三种长度的编码:单字节的ASCII、双字节的GBK(略带扩展)、以及用于填补所有Unicode码位的四字节UTF区段。
Unicode
不同的国家和地区制定了适用于本国和地区的字符表示标准,但是这些标准之间往往是不兼容的,比如用GB18030编码的文件通过阿拉伯文的编码标准去解析,肯定是显示一堆乱码。同时,随着计算机科学和互联网的不断发展,软件国际化逐渐成为了必然的趋势。在此背景下,一种包含了世界各地绝大部分文字字符的通用字符集就应运而生了 -- Unicode字符集。
1.编码方式
Unicode存在两种编码方式,分别是UCS-2和UCS-4。
UCS-2: 采用两个字节编码,理论上最多可以表示2^16(65536)个字符。
UCS-4: 采用四个字节编码,理论上最多可以表示2^32(2147483648)个字符,完全可以涵盖所有语言的字符。
2.实现方式
Unicode的实现方式不同于编码方式。一个字符的Unicode编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)。
● UTF-8: 以8bits(1字节)为单位对UCS进行编码,可以用1到4个字节来表示一个字符,是一种字节变长度编码方式。
● UTF-16: 以16bits(2字节)为单位对UCS进行编码,可以用2字节或4字节来表示一个字符,是一种字节变长度编码方式。
● UTF-32: 以32bits(4字节)为单位对UCS进行编码,用4字节来表示一个字符,是一种字节固定长度编码方式。
UTF-8:
由于UTF-16和UTF-32都存在空间浪费的情况,而UTF-8采用字节为单位的变长编码方式,大大提高了空间利用率,因此,UTF-8也是我们平时用的最多的编码方式。
UTF-8的编码规则有两条:
● 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的Unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
● 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的Unicode码。