引入编码的原因:计算机只能存储二进制数。所以要存放字符,就要存放对应码表数字的二进制数。
并不是直接存入对应的字符轮廓。显示的时候也是将二进制数转换为十进制数字,去查找对应码表
来进行解码。
ASCII:第一张码表,只兼顾了拉丁字符和常用符号
a--97 z--122 A--65 Z--90
0--48 1--49 9--57
该码表一共有128对,0-127的数字,每个数字代表一个字符。一个字符代表一个字节。
该码表对应7位二进制数,但计算机处理的基本单位是一个字节,也就是8位,因此最高位都用0来代替。
后来字符不够用,就将其扩充128个字符,也就是256字符。最高位都是1。将其称为扩展ASCII码。
gb2312:中国自己制定的码表,0-127数字是ASCII编码,之后就是一些中文字符,其中也包含ASCII码中原有的一些符号,但这些符号都占用了两个字节,
就是常说的“全角“符号,ASCII码中的就叫做”半角“字符。该码表包含简体中文。
gbk:也是中国的码表,在gb2312的基础上。包含繁体字。
gb18030:在gbk的基础上,囊括了大多数少数民族常用字符。
在以上中国码表中,数字字母均为1个字节,汉字为两个字节。
unicode:也叫万国码。包含世界上大多数文字。java的默认码表,它是16位的码表。在java中是用两个字节来表示一个字符。
对于ASCII里的那些“半角”字符,unicode保持其原编码不变,只是将其长度由原来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。
由于unicode规定所有字符占两个字节,原本英文字符在ASCII码中只需要一个字节就能存储,现在确需要浪费一半的空间来存储,对资源是一种极大的浪费。
utf-8:是在互联网上使用最广的一种unicode的实现方式,这是为传输而设计的编码,并使编码无国界,UTF-8是一种可变的编码方式。
它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,
保留了ASCII字符一个字节的编码做为它的一部分,UTF-8一个中文字符占3个字节。从unicode到uft-8并不是直接的对应,而是要过一些算法和规则来转换。
在以上码表中中文所对应的二进制数不都相同,因此可以得出中文乱码产生的根本原因就是编码和解码用了不同的码表。
字节的是byte,位是bit,1 byte = 8 bit ,也就是一个字节有8位。
“字节”是一个8位的物理存储单元,而“字符”则是一个文化相关的符号。