字符集编码—ASCII/ISO-8859-1/GBK/unicode/UTF-8
为什么要编码?
答:要表示的符号太多,没有统一的标准,计算机无法识别没有标准的字符
定长编码便于计算机处理,GBK 不是定长编码,unicode 属于定长编码
ASCII—美国信息交换标准代码
用一个字节的低 7 位表示,最早出现的字符集,美国标准,2 的七次方的字符,共 128 种
问题:无法包含其他国家的字符
ISO-8859-1
一个字节(8bit 1byte),2 的八次方,共 256 种,相比于 ASCII 多了一倍字符集,包括拉丁字和西欧语
问题:依然无法包含所有其他国家的字符,中文
GBK
两个字节表示一个汉字,中国汉字专属编码格式 例:A5 B6
GB2312/GBK/GB18030
- gb2312 只能表示简体字
- gbk 编码能够用来同时表示繁体字和简体字,兼容 gb2312
- gb18030 包含所有的中文文字
问题:无法让全世界编码规范统一,每个国家的字符集都不一样
unicode
为了解决全世界编码规范不同的问题,出现了 unicode 编码规范,它实现的编码方式可表示全世界所有的字符集,定长双字节,是一种 根本标准
,具体使用是使用它的实现
Unicode 编码字符集旨在收集全球所有的字符,为每个字符分配唯一的字符编号即代码点(Code Point),从 U+0000 到 U+FFFF 被划分为 17 个平面,现在包括 1114111 个编码点
Code Point: 码点,简单理解就是字符的数字表示。
Unicode 当然是一本很厚的字典,记录着世界上所有字符对应的一个数字。具体是怎样的对应关系,又或者说是如何进行划分的,就不是我们考虑的问题了,我们只用知道 Unicode 给所有的字符指定了一个数字用来表示该字符。
\u597d
->好
问题:原来一个字节可以表示的字符现在需要两个字节了
UTF-8
unicode translation format-8
,属于 unicode 的一种实现,使用 unicode 标准
为了解决 unicode 原来一个字节可以表示的字符现在需要两个字节的问题,出现了相对应的 utf-8,utf-16,utf-32
UTF- 8 是一种可变长编码,可以使用 1 - 4 个字节表示一个字符,完全兼容 ASCII
- 对于单个字节的字符,第一位设为 0,后面的 7 位对应这个字符的 Unicode 码点。因此,对于英文中的 0 – 127 号字符,与 ASCII 码完全相同。这意味着 ASCII 码那个年代的文档用 UTF-8 编码打开完全没有问题。
- 对于需要使用 N 个字节来表示的字符(N > 1),第一个字节的前 N 位都设为 1,第 N + 1 位设为 0,剩余的 N – 1 个字节的前两位都设位 10,剩下的二进制位则使用这个字符的 Unicode 码点来填充
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 |
由此可以根据编码表区别这个字符是 1 个字节还是 n 个字节
参考博客:
https://www.ibm.com/developer…