您的位置:首页 > 理论基础

计算机编码世界(一)

2015-07-27 11:58 225 查看

一. 基础知识

计算机中储存的信息都是用二进制数表示的;而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。 通俗的说,按照何种规则将字符存储在计算机中,如'a'用什么表示,称为"编码"; 反之,将存储在计算机中的二进制数解析显示出来,称为"解码",如同密码学中的加密和解密。 在解码过程中,如果使用了错误的解码规则,则导致'a'解析成'b'或者乱码。

二. 字符集与字符编码

字符是各种文字和符号的总称,包括各个国家文字、标点符号、图形符号、数字等。字符集是多个字符的集合, 字符集种类较多,每个字符集包含的字符个数不同,常见字符集有:ASCII字符集、ISO 8859字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。

使用哪些字符。也就是说哪些汉字,字母和符号会被收入标准中。所包含“字符”的集合就叫做“字符集”。 规定每个“字符”分别用一个字节还是多个字节存储,用哪些字节来存储,这个规定就叫做“编码”。

各个国家和地区在制定编码标准的时候,“字符的集合”和“编码”一般都是同时制定的。 因此,平常我们所说的“字符集”,比如:GB2312, GBK, JIS 等,除了有“字符的集合”这层含义外,同时也包含了“编码”的含义。
2.1 ASCII

ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)

单字节,能表示256个字符.但只使用了127个.最前面一位统一为0.

0x00-0x20表示控制0x21-0x7F表示字符。
2.2 EASCII

将ASCII中的第八位也用上,那么就是8位的字符编码了

将EASCII中0xA0-0xFF这部分比ASCII码扩充出来的编码, 用来表示表格符号、计算符号、希腊字母和特殊的拉丁符号。

2.3 ISO/IEC 8859

利用了ASCII的7位编码所没有用到的第8位,这样就编码范围就 从原先ASCII的0x00-0x7F多扩展出了0x80-0xFF,其中的0xA0-0xFF部分,被ISO/IEC 8859编码所用到。

ISO/IEC 8859是一组编码规则的总称,其下包含了共15个字符集,即ISO/IEC 8859-n,其中n=1,...,11,13,...,16

这15个字符集,每一个字符集,编码取值都是0xA0-0xFF,但是对于同一个值,不同字符集所对应的字符,都不太一样。

2.4 ISO/IEC 6429

ISO/IEC 6429是专门定义对应的控制字符的,其中,0x0-0x1F部分称为C0控制(C0 control )字符,0x80-0x9F部分称为C1控制(C1 control)字符。 对应的C0 control部分,和ASCII编码重复定义了,但是两者含义都是一样的,所以编码规则并不冲突。
可以算是,在控制字符领域,ISO/IEC 6429在ASCII的C0 control的基础上,对于由ASCII的7位所扩展出的8位编码中的0x80-0x9F这部分,也做出了对应的定义。

注意:

ISO 8859和ISO-8859,不是同一个东西。

因此,ISO-8859-n所以可以表示:

ISO-8859 = ISO-8859-n的简称 = ISO 8859-n + ASCII + ISO/IEC 6429

ISO-8859-1 = ISO 8859-1 + ASCII + ISO/IEC 6429 = ISO/IEC 8859-1 + ASCII + ISO/IEC 6429

2.5 Unicode(重点)

Unicode是一个字符集,它包含了世界所有的字符,但它只规定了字符的二进制代码。

UCS是Unicode的一个简称,早期Unicode都是用2个字节16位来表示字符.

但只能表示65536个字符,但后来随着字符的增多,用4个字节32位表示(其实只有31位,最左边一位为0)

因此有了2个标准USC-2,USC-4.字面意思很清楚,4个字节向下兼容2个字节.

Unicode的实现有3个UTF-8,UTF-16,UTF-32.其中UTF-16就是我们所说的Unicode编码.也就是USC-2的实现

对于Unicode也就是UTF-16编码来说,例如'严'的汉字编码是4E25,如果在存储的时候是按照4E25的顺序存储, 那也就是大头(Big endian)的方式,Unicode码还有小头(Little endian)的方式,按照254E的方式存储. Unicode编码是小头方式.
因此使用Unicode的编码需要区分大头和小头,Unicode规范中推荐的标记字节顺序的方法是BOM.(只在Unicode特有)

在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。 UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。

这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的; 如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。 UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO
WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF.

原创摘自:http://beadlechen.github.io/content/blog.html#category=software#article=encode
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: