在计算机中,我们储存的信息都是用二进制码表示的。我们认识的、屏幕上显示的英文、汉字等符号和储存用的二进制代码的互相转换,就是编码。
有两个基本概念需要说明,charset 和 characterencoding:
charset ,字符集,也就是某个符号和某个数字映射关系的一个表,也就是它决定了107 是koubei的 ‘a’,21475 是口碑的“口”,不同的表有不同的映射关系,如 ascii,gb2312,Unicode. 通过这个数字和字符的映射表,我们可以把一个二进制表示的数字转换成某个字符。
chracter encoding ,编码方式。例如,同是对于应“口”的 21475 这个数,我们是用 u5k3e3表示呢,还是用口来表示呢?这就是由 characterencoding 来决定的。
字符集
ASCII及其扩展字符集
作用:表语英语及西欧语言。
位数:ASCII是用7位表示的,能表示128个字符;其扩展使用8位表示,表示256个字符。
范围:ASCII从00到7F,扩展从00到FF。
ISO-8859-1字符集
作用:扩展ASCII,表示西欧、希腊语等。
位数:8位,
范围:从00到FF,兼容ASCII字符集。
GB2312字符集
作用:国家简体中文字符集,兼容ASCII。
位数:使用2个字节表示,能表示7445个符号,包括6763个汉字,几乎覆盖所有高频率汉字。
范围:高字节从A1到F7, 低字节从A1到FE。将高字节和低字节分别加上0XA0即可得到编码。
BIG5字符集
作用:统一繁体字编码。
位数:使用2个字节表示,表示13053个汉字。
范围:高字节从A1到F9,低字节从40到7E,A1到FE。
GBK字符集
作用:它是GB2312的扩展,加入对繁体字的支持,兼容GB2312。
位数:使用2个字节表示,可表示21886个字符。
范围:高字节从81到FE,低字节从40到FE。
GB18030字符集
作用:它解决了中文、日文、朝鲜语等的编码,兼容GBK。
位数:它采用变字节表示(1ASCII,2,4字节)。可表示27484个文字。
范围:1字节从00到7F; 2字节高字节从81到FE,低字节从40到7E和80到FE;4字节第一三字节从81到FE,第二四字节从30到39。
UCS字符集
作用:国际标准 ISO 10646定义了通用字符集(UniversalCharacter Set)。它是与UNICODE同类的组织,UCS-2和UNICODE兼容。
位数:它有UCS-2和UCS-4两种格式,分别是2字节和4字节。
范围:目前,UCS-4只是在UCS-2前面加了0×0000。
UNICODE字符集
作用:为世界650种语言进行统一编码,兼容ISO-8859-1。
位数:UNICODE字符集有多个编码方式,分别是UTF-8,UTF-16和UTF-32。
现在使用最广泛 Unicode的编码方式就是 UTF-8 (8-bitUCS/Unicode Transformation Format) 了,最大的特点就是是一种变长编码方式(variable-length character encoding),根据不同符号变化字节长度,兼容ascii,使得以前使用纯ascii 编码的系统兼容,而且不会增加额外的存储量(假设定长的编码方式,规定每个字符由2个bytes 组成,那么这时候 ascii字符占用的存储空间将增大一倍)。
要把 UTF-8说清楚,引入一个表会更方便了:
U-00000000 –U-0000007F:0xxxxxxx
U-00000080 –U-000007FF:110xxxxx 10xxxxxx
U-00000800 –U-0000FFFF:1110xxxx 10xxxxxx 10xxxxxx
U-00010000 –U-001FFFFF:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 –U-03FFFFFF:111110xx 10xxxxxx 10xxxxxx 10xxxxxx10xxxxxx
U-04000000 –U-7FFFFFFF:1111110x 10xxxxxx 10xxxxxx 10xxxxxx10xxxxxx 10xxxxxx
如果一个utf-8编码的byte 的二进制码是0xxxxxxx,是0开头的,即十进制的0-127之间,那么他就是单独的这一byte 代表一个字符,而且是拥有和 ascii 码完全一样的含义。其他所有的utf8 编码的二进制值都是用1开头的1xxxxxxx,大于127的,而且都需要至少2 bytes才能代表一个符号。所以一个字节的第一位是一个开关,代表这个字符是不是一个ascii 码。在以上编码中一个非ascii符号可用UTF-8的2~6个bytes来表示,其中第一个byte开始部分连续1的个数标志该符号使用的bytes数,后面bytes均使用10开头
编码识别
UNICODE,根据前几个字节可以判断UNICODE字符集的各种编码,叫做Byte Order Mask方法BOM:
UTF-8: EFBBBF (符合UTF-8格式,请看上面。但没有含义在UCS即UNICODE中)
UTF-16 Big Endian:FEFF (没有含义在UCS-2中)
UTF-16 Little Endian:FFFE (没有含义在UCS-2中)
UTF-32 Big Endian:0000FEFF (没有含义在UCS-4中)
UTF-32 Little Endian:FFFE0000 (没有含义在UCS-4中)
GB2312:高字节和低字节的第1位都是1。
BIG5,GBK&GB18030:高字节的第1位为1。操作系统有默认的编码,常为GBK,可以下载别的并升级。通过判断高字节的第1位从而知道是ASCII或者汉字编码。