计算机编码世界(一)

一. 基础知识

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

二. 字符集与字符编码

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

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

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


ASCII(American Standard Code for Information Interchange,美国标准信息交换代码) 
单字节,能表示256个字符.但只使用了127个.最前面一位统一为0.
0x00-0x20表示控制0x21-0x7F表示字符。


将ASCII中的第八位也用上,那么就是8位的字符编码了
将EASCII中0xA0-0xFF这部分比ASCII码扩充出来的编码, 用来表示表格符号、计算符号、希腊字母和特殊的拉丁符号。

利用了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,但是对于同一个值,不同字符集所对应的字符,都不太一样。

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值