首先我们需要明白计算机底层中所有东西只能由010101二进制表现出来的,那么我们如何用01二进制来表现我们生活中字母数字呢?聪明的远古人类想到将01二进制数字和我们生活中的文字关联起来,形成一一对应。这样我们在计算机内部实际存储的是数字,而我们看到的则是经过渲染的文字。
一、ASCII
由于美国日常使用中只有字母和数字,还有一些控制字符。一个字节8位,8位可以表示256种字符。因此用一个字节就可以很好满足美国使用要求。
Bin(二进制) Oct(八进制) Dec(十进制) Hex(十六进制) 缩写/字符 解释
00000000 0 0 00 NUL(null) 空字符
00000001 1 1 01 SOH(start of headline) 标题开始
00000010 2 2 02 STX (start of text) 正文开始
00110000 60 48 30 0 数字0
00110001 61 49 31 1 数字1
00110010 62 50 32 2 数字2
01000001 101 65 41 A 大写字母A
01000010 102 66 42 B 大写字母B
01000011 103 67 43 C 大写字母C
根据上面的表格就能很好的将文字与二进制码对应起来,方便计算机存储。
二、gb2312和GBK
现在美国文字可以很好表达,但是其他国家就不同意了,每个国家都有不同的文字。而我中国同样有着博大精深汉字。为了满足汉字需求,gb2312应运而生。
由于一个字节已经无法满足数量的要求了。所以采用两个字节来表示汉字。第一个字节称为“高位字节”(也称“区字节)”,第二个字节称为“低位字节”(也称“位字节”)。区位码=区字节+位字节。例如“啊”字在大多数程序中,会以两个字节,0xB0(第一个字节) 0xA1(第二个字节)储存。
虽然基本上gb2312已经能够覆盖99%的汉字,但是gb2312无法处理一些特殊文字,比如古文字。进一步有了GBK编码被设计出来。几乎涵盖了所有汉字。
需注意gb2312和GBK都是兼容ascii编码的。也就是说gbk包含了ascii中的字符映射。
中文还有个GB18030能够容纳更多文字。
三、Unicode
每个国家都可以自己制定一套编码自己使用,比如我们中国使用gbk,但是你怎么和别人交流呢?别人可不管你使用的是gbk。这时候就需要一个统一组织将所有的文字都能够编码,要让所有国家都能认可。
Unicode又称统一码、万国码。在表示一个Unicode的字符时,通常会用“U+”然后紧接着一组十六进制的数字来表示这一个字符。Unicode为了包含所有文字,使用更多位的字节的表示。但是对于有些文字使用多字节是比较浪费的,比如数字1,在ascii编码中明明能够使用一个字节就能够表示,在Unicode中有可能就是多字节表示。大大浪费的存储。
四、utf-8
utf-8是Unicode的一种实现方式。实际情况使用变字节的来表示文字。使用1~4个字节表示一个字符,根据不同的字符而变化字节长度,当字符在ASCII 码的范围时,就用一个字节表示,而一个中文字符占3个字节。