字符编码

本文学习了阮一峰老师的两篇文章:《字符编码笔记:ASCII,Unicode和UTF-8》Unicode与JavaScript详解

1、简介

计算机内部的信息都可以表示为一个二进制的字符串:
位(bit):二进制单位,以0或1表示;
字节(byte):8bit = 1byte。

一个字节用8个位表示就是00000000(十进制0) ~ 11111111(十进制255),即2^8 = 256种,一个字节能表示的最大的整数就是255。

2、ASCII

ASCII是将英文字符对应一个字节,包括大小写英文、数字和一些控制符号,共128个英文字符。对应匹配了128个字节,每个字节的第一个位为0,英文字符占后7位,也就是000000000 ~ 01111111,即2^7 = 128种。

大写字母A的ASCII编码是65,如下图ASCII表:
ASCII表

非ASCII:
处理英文字符用128个字节就够了,但是对于其他语言就不行了,例如中文,光汉字就有很多,所以中国制定了GB2312编码,使用两个字节表示一个汉字,理论上有256*256个。
其他国家也同样会创造自己的编码,这样就会出现乱码,为了统一编码,Unicode诞生。

3、Unicode

Unicode的出现就是为了统一字符编码,将所有符号纳入其中,从0开始,为每个符号指定一个编号,叫“码点”,如下:

U + 000 = null

上式中,U + 表示紧跟后面的十六进制数是Unicode码点。

目前的Unicode的符号超过10万个,如此多的符号,不是一次行定义,而是分区定义。每个分区存放2^16 = 65536个字符,称为一个平面(plane),共有17个平面,整个Unicode字符集大小为2^21。

最前面的65536个字符位,称为基本平面(BMP),码点范围:0 ~ 2^16 - 1,对应十六进制为U + 0000 ~ U + FFFF;
剩下的字符都放在辅助平面(SMP),共16个辅助平面,码点范围:U + 010000 ~ U + 10FFFF。

Unicode编码规则

ASCII编码和Unicode编码的区别:

  • 字母A用ASCII的十进制是65,二进制是01000001,用Unicode编码,需在前面补0,A的Unicode编码为00000000 01000001;

  • 汉字‘中’ 超过ASCII范围,用Unicode编码十进制是20013,二进制是01001110 00101101;

实际上,用Unicode编码是2个字节,ASCII编码是1个字节,需要多一倍的存储空间,如果只用英文字符,这样的方式会浪费存储空间。

4、UTF-8

UTF-8是Unicode实现方式之一。

特点:

  • 可使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

规则:

  • 单字节符号,字节的第一位为0,后7位是这个符号的unicode码,对于英文字母,UTF-8和ASCII相同;
  • 对于n > 1字节的符号,第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位都是10,剩下的为这个符号的unicode码。

ASCII和Unicode的对比

再来看下ASCII、Unicode和UTF-8三者示例对比:
三者对比

根据示例,字母A的第一位是0,则这个字节就是一个字符;如果第一位是1,则连续多少个1,就表示当前字符占多少个字节;
汉字‘中’的码点为基本平面,范围在U + 0000 ~ U + FFFF,对应UTF-8的编码是3个字节,所以第一个字节的前三位都为1,后面都为0;第2和第3个字节的前两位都为10。

本文地址:http://jiangxinlei.cn/2017/07/25/字符编码/ ,转载请注明,谢谢

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器