计算机编码世界(一)
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
相关文章推荐
- 一个计算机专业学生几年的编程经验汇总
- “NET网络”进行中,多管齐下的人才力挫“”粗俗
- 数据结构实验:连通分量个数(并查集)
- web服务器使用HTTPS,基于tomcat :nginx配置
- 数据结构---字符串(1)
- hdoj 3342 Legal or Not(拓扑排序)
- 简单介绍线性表以及如何实现双链表
- HTTP协议--cookie、session、缓存与代理
- TCP/IP详解学习笔记--TCP的基本概念
- Linux strace命令 http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html
- Android使用http协议的GET和POST方法!!!
- 关于httpHeader和httpbody用法总结
- 半同步半异步高性能网络编程
- Android检测网络状态,判断当前网络是否可用
- 网络数据分类
- 分布式网络架构
- 对普利姆算法的理解(大话数据结构)。
- hdu 5294 - Tricks Device(2015 Multi-University Training Contest 1 )最短路+网络流
- ubuntu无法连接网络
- HDU 3549 基础网络流EK算法 Flow Problem