1.字符编码
因为计算机只能读懂0和1,而我们的语言有很多字母和符号,所以这个时候就引入了字符编码。
1)ASCLL编码:
针对英文字母的
2)ASCLL编码的扩展:GB2312或GB2312-80
《信息交换用汉字编码字符集》是由中国国家标准总局1980年发布,1981年5月1日开始实施的一套国家标准,标准号是[GB 2312](https://baike.baidu.com/item/GB 2312)—1980。
GB2312编码适用于汉字处理、汉字通信等系统之间的信息交换,通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB 2312。
基本集共收入汉字6763个和非汉字图形字符682个。整个字符集分成94个区,每区有94个位。每个区位上只有一个字符,因此可用所在的区和位来对汉字进行编码,称为区位码。
把换算成十六进制的区位码加上2020H,就得到国标码。国标码加上8080H,就得到常用的计算机机内码。1995年又颁布了《汉字编码扩展规范》(GBK)。GBK与GB 2312—1980国家标准所对应的内码标准兼容,同时在字汇一级支持ISO/IEC10646—1和GB 13000—1的全部中、日、韩(CJK)汉字,共计20902字。
这种扩展的编码容易存在乱码的问题,因为不同的国家有自己国家的编码。
3)UNICODE
什么是UNICODE?
这是一个编码方案,换句话说就是一张包含全世界所有文字的编码表。
UNICODE编码范围是:0-0x10FFFF,可以容纳100多万个符号。
UNICODE的问题:
UNICODE只是一个字符集,它只是规定了符号的二进制代码是什么,但是没有规定这个二进制代码该如何存储。
4)如何存储UNICODE:UTF-16/UTF-8是UNICODE的实现方式
UTF-16
UTF-16编码是以16位无符号整数位单位,注意是16位为一个单位,不表示一个字符就只有16位。这取决于unicode编码处于什么范围,有可能是2个字节,也有可能是4个字节。现在机器上的unicode编码一般指的是UTF-16
UTF-8
UNICODE编码(16进制) | UTF-8字节流(二进制) |
---|---|
000000-00007F | 0xxxxxxx |
000080-0007FF | 110xxxxx 10xxxxxx |
000800-00FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
010000-10FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
那么为什么有UTF-16了还出现了UTF-8呢?这跟这两个的大小有关,比如一个符号,你用一个字节就可以存储,但是如果你用UTF-16那你最小被分配2个字节,如果这是在自己硬盘上没什么,不过是多用点空间,但是如果是在网络中传输,本来2k的数据,你要传输4k,这就造成了数据传输的弊端,为了解决这种弊端,出现了UTF-8(变长的存储方案,你多大,就给你多大的空间)
两者优缺点:
UTF-16:
优点:容易解析
缺点:占空间
UTF-8:
优点:占空间更小
缺点:不容易解析
BOM(Byte Order Mark):
UTF-8 | EF BB BF |
---|---|
UTF-16LE | FF FE(小端存储) |
UTF-16BE | FE FF(大端存储) |