字符编码与解码
码点
每个字符对应的数字叫做码点
字符集
标准所支持的所有字符及其对应的码点的集合成为字符集
字符编码
字符 到 存储在计算机的内容 的映射叫做编码
ASCII编码 ,针对ASCII字符集编码,特点第一个bit位一定是0
UTF 是 Unicode Transformation Format的缩写,意为Unicode转换格式
UTF-32编码 针对Unicode编码, 就是直接把对应的码点直接以二进制存储在计算机里,每个字符 无论码点大小都是 4字节,前面补0
UTF-8 是针对Unicode的可变长度编码,用1到6个字节编码UNICODE字符, 兼容ASCII, 使码点小的字符相应需要更少的空间存储
码点和二进制存储规则, 二进制码点被分割后被存储,通过头字节(几个1表示几字节,如果是0就是1字节)可以知道各字符在内存中的长度
这种编码4字节已经可以表示200多万个字符,已经满足全球所有字符,并且收录了绘文字emoji字符
码点范围(10进制, 两头包含) | 码点范围(二进制, 两头包含) | 存储(二进制) |
---|---|---|
0-127 | 0zzzzzzz | 0zzzzzzz |
128-2047 | 00000yyy yyzzzzzz | 110yyyyy 10zzzzzz |
2048-65535 | xxxxyyyy yyzzzzzz | 1110xxxx 10yyyyyy 10zzzzzz |
65536-1114111(2097151?) | 000wwwxx xxxxyyyy yyzzzzzz | 11110www 10xxxxxx 10yyyyyy 10zzzzzz |
2^21 - 2^26-1 |
000000kk wwwwwwxx xxxxyyyy yyzzzzzz | 111110kk 10wwwwww 10xxxxxx 10yyyyyy 10zzzzzz |
2^26- 2^31-1 |
0vkkkkkk wwwwwwxx xxxxyyyy yyzzzzzz | 1111110v 10kkkkkk 10wwwwww 10xxxxxx 10yyyyyy 10zzzzzz |
ASCII
ASCII 美国信息交换标准代码
包含 数字,大小写字母, 常用英文符号和控制字符
码点为0-127
ASCII 字符集一共包含128个字符
二进制码点第一个为0,后面7bit位(2^7)刚好可以表示128种组合
Unicode
包含14万个字符(码点)
其他字符编码
大陆1981年制定GB2312, 对GB2312进行扩充的为GBK(收录了简繁体,日文,韩文等)编码
港澳台1984年流行使用Big5 大五码
乱码
锟斤拷
替换符号, 黑色菱形中一个白色问号
Unicode有个特殊的字符, 用于表示无法识别或展示的字符,
在UTF-8中的编码是3字节11101111 10111111 10111101
16进制为EF BF BD
其他字符编码在无法识别字符的情况下使用这个符号进行替换 用于提示用户
如果连续两个这样的符号出现,再用utf8编码 就变成EF BF BD EF BF BD
再用GBK编码 读取 就会是锟斤拷,因为GBK每个字符都是两字节, 对应的字符为EF BF 锟 BD EF 斤 BF BD 拷