ASCII 编码
ASCII占用8位(bit)。8个bit可以表示256个字符。
ASCII码只规定了128个字符的编码。
ASCII码的问题是字符太少,不能满足世界各国的需要。所以各国其他编码利用剩余的128个字符定义各自不同的编码。
GB2312 & GBK
汉字GB2312 使用两个字节(16位),最多表示65536个字符。
一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE
gb2312中两个字符组成的编码的字符叫做“全角”字符,而原来在127号以下的那些就叫”半角”字符了
对GB2312扩展就得到了GBK,再扩展得到GB18030(少数民族文字)。
所以,一个字节小于127的编码都按照ASCII码查,大于127的字节+之后的字节(一共两个字节16位)组成汉字的编码。
所以,“一个汉字两个英文字符”就是这么来的。
Unicode
为了统一一种编码,Unicode出现了。
Unicode 目前规划的总空间是17个平面(平面0至16),0x0000 至 0x10FFFF。最前面的65536个字符位,称为基本平面(缩写BMP) 。每个平面有 65536 个码点。
Unicode只规定了每个字符的码点,到底用什么样的字节序表示这个码点,就涉及到编码方法。
最直观的编码方案就是 UTF-32
UTF-32
由于Unicode是0x0000 至 0x10FFFF,直接用定长的4个字节来表示对应的字符
U+0000 = 0x0000 0000 U+597D = 0x0000 597D
这样好处是直观,但是太浪费空间了。
UTF-8
UTF-8是一种变长的编码,从1字节到4字节。
英文字母为1个字节,汉字为3个字节。
Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
—————————————————————–
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Reference 字符编码的演变
中国人民通过对 ASCII 编码的中文扩充改造,产生了 GB2312 编码,可以表示6000多个常用汉字。
汉字实在是太多了,包括繁体和各种字符,于是产生了 GBK 编码,它包括了 GB2312 中的编码,同时扩充了很多。
中国是个多民族国家,各个民族几乎都有自己独立的语言系统,为了表示那些字符,继续把 GBK 编码扩充为 GB18030 编码。
每个国家都像中国一样,把自己的语言编码,于是出现了各种各样的编码,如果你不安装相应的编码,就无法解释相应编码想表达的内容。
终于,有个叫 ISO 的组织看不下去了。他们一起创造了一种编码 UNICODE ,这种编码非常大,大到可以容纳世界上任何一个文字和标志。所以只要电脑上有 UNICODE 这种编码系统,无论是全球哪种文字,只需要保存文件的时候,保存成 UNICODE 编码就可以被其他电脑正常解释。
UNICODE 在网络传输中,出现了两个标准 UTF-8 和 UTF-16,分别每次传输 8个位和 16个位。于是就会有人产生疑问,UTF-8 既然能保存那么多文字、符号,为什么国内还有这么多使用 GBK 等编码的人?因为 UTF-8 等编码体积比较大,占电脑空间比较多,如果面向的使用人群绝大部分都是中国人,用 GBK 等编码也可以。