编码方式(I)

一.位:

计算机存储信息的最小单位,称之为位(bit),音译比特,二进制的一个“0”或一个“1”叫一位。

二.字节

字节(Byte)是一种计量单位,表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位,8个二进制位组成1个字节。在ASCII码中,一个标准英文字母(不分大小写)占一个字节位置,一个标准汉字占二个字节位置。

三.字符

字符是指计算机中使用的文字和符号,比如“1、2、3、A、B、C、~!·#¥%…*()+”等等。

四.ASCII码

先从最简单的ASCII说起吧,这个大家也熟悉:全名是American Standard Code for Information Interchange, 叫做“美国信息交换标准码”。ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。ASCII码是目前最普及的一种字符编码,它扎根于我们的互联网,操作系统,键盘,打印机,文件字体和打印机等。ASCII表如下:

当然,从这个名字美国信息交换标准码来看,ASCII码只适用于他们。

五.ANSI码

ANSI编码是一种对ASCII码的拓展:ANSI编码用0x00~0x7f (即十进制下的0到127)范围的1 个字节来表示 1 个英文字符,超出一个字节的 0x80~0xFFFF 范围来表示其他语言的其他字符。也就是说,ANSI码仅在前128(0-127)个与ASCII码相同,之后的字符全是某个国家语言的所有字符。值得注意的是,两个字节最多可以存储的字符数目是2的16次方,即65536个字符,这对于一个语言的字符来说,绝对够了。还有ANSI编码其实包括很多编码:中国制定了GB2312编码,用来把中文编进去另外,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准。受制于当时的条件,不同语言之间的ANSI码之间不能互相转换,这就会导致在多语言混合的文本中会有乱码。

六.GBK

而GBK是专门的中文编码方式,是在ASCII表的基础上扩展来的,所以GBK也是兼容ASCII表的,随着GBK字符集的不断更迭,GBK编码方式也在不断进化,GBK2312,GBK18030,但是都支持向前兼容,所以使用GBK18030是可以兼容之前所有的GBK编码方式的。其中BIG5指的是繁体中文的编码方式

七.Unicode编码

为了解决不同国家ANSI编码的冲突问题,Unicode应运而生:如果全世界每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。

Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。

但是问题在于,原本可以用一个字节存储的英文字母在Unicode里面必须存两个字节(规则就是在原来英文字母对应ASCII码前面补0),这就产生了浪费。那么有没有一种既能消除乱码,又能避免浪费的编码方式呢?答案就是UTF-8!

八.UTF-8编码

这是一种变长的编码方式:它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,如此一来UTF-8编码也可以是为视为一种对ASCII码的拓展。值得注意的是unicode编码中一个中文字符占2个字节,而UTF-8一个中文字符占3个字节。从unicode到uft-8并不是直接的对应,而是要过一些算法和规则来转换。

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件。

九.UTF家族

先来说UTF家族,UTF编码格式是针对Unicode字符集进行的编码格式,包括UTF-8,UTF-16,UTF-32,其中UTF-16使用两个自己表示一个字符,UTF-32使用四个字节表示一个字符,这两种都是使用固定的字节来表示一个字符,而UTF-8则是可变长度的编码方式,它根据字符的长度进行动态修改,使用1-4个字节来进行每个字符的编码,相对于上面两种编码方式,在存储数据的时候就极大的节省了空间,因为是可变长度的来表示字符,所以UTF-8是兼容ASCII码表的,同时也可以表示Unicode中所有的字符,所以UTF-8是最流行的编码方式。这是一种变长的编码方式:它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,如此一来UTF-8编码也可以是为视为一种对ASCII码的拓展。值得注意的是unicode编码中一个中文字符占2个字节,而UTF-8一个中文字符占3个字节。从unicode到uft-8并不是直接的对应,而是要过一些算法和规则来转换。在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。

用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件。

.大端小端
下面再来说说大端序和小端序:
   所谓的大端序,小端序就是在数据在传输过程中,由于不同电脑CPU硬件不同,在读数据的时候,假如cpu是大端序那么字节高位在前,如果cpu是小端序那么字节低位在前。例如,一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”?如果BOM是大端序,那么代码点就应该是594E,那么就是“奎”,如果BOM是小端序,那么代码点就应该是4E59,就是“乙”了。

这样在传输的过程中就会产生错误,多字节的Unicode编码方式定义了一个"字节顺序标记(Byte Order Mark)"即BOM,它是一个特殊的非打印字符,你可以把它包含在文档的开头来指示你所使用的字节顺序,让计算机知道谁在高位,谁在低位。对于UTF-16,字节顺序标记是U+FEFF。如果收到一个以字节FF FE开头的UTF-16编码的文档,你就能确定它的字节顺序是小端了;如果它以FE FF开头,则可以确定字节顺序大端的了。

如果细心的话,你会看到上面说大端序和小端序的时候有一个限定词,就是「多字节的Unicode编码」,那么如果不是多字节的时候呢?如UTF-8我们知道UTF-8 是可变长度的编码方式,有的字符使用的是单字节编码,如英文字母,有的字符是多字节编码,UTF-8是没有大小端序之分的,为什么呢?就是因为UTF-8是以单字节为编码单元的,而数据的读取的最小单位就是字节,所以说对于 UTF-8 来说根本就没有顺序的问题,你可能会问,你不是说 UTF-8 也有多字节编码的时候吗?是的,即使是多字节编码的时候,也是以一个字节为一个单元来处理的,而 UTF-16 和 UTF-32 的单元分别是 2 个字节和 4 个字节。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值