概念

字符
Character
一个字符是一个单位的字形、类字形单位或符号的基本信息。
各种文字和符号的总称。一个字符可以是一个中文汉字、一个英文字母、一个阿拉伯数字、一个标点符号、一个图形符号或者控制符号等。
字符集
Character Set
多个字符的集合,
不同的字符集包含的字符个数不一样、包含的字符不一样、对字符的编码方式也不一样。
字符编码
Character Encoding
一种映射规则,根据这个映射规则可以将某个字符映射成其他形式的数据以便在计算机中存储和传输。
码点:
Code Point,码值或内码
指在某个字符集中,根据某种编码规则将字符编码后得到的值。

总结:通俗解释字符集就是把字符放到一起的一个集合。而这个集合的每一个字符都对应一个数字,叫做码点。那么,这样就建立起来数字和字符之间的索引关系。那么,某个字符在计算机中怎么表示,具体占用几个字节等等,这些就需要编码规则来解决了。这个就是字符编码,他来解决根据某个规则来将字符映射到相应的码点上面。

BOM
Byte Order Mark
用来放在文档的开头告诉阅读器该文档的字节序
BOM为U+FEFF,因为UCS-2没有定义

字符集

ASCII字符集
一共规定了128个字符的编码规则
每个字符占用一个字节的后面7位,最前面的1位统一规定为0
0~31 是控制字符如换行回车删除等,32~126 是可打印字符,可以通过键盘输入并且能够显示出来。

EASCII字符集
Extended ASCII
可以表示256个字符
ISO8859-1 字符集,也就是 Latin-1,是西欧常用字符,包括德法两国的字母。
ISO8859-2 字符集,也称为 Latin-2,收集了东欧字符。
ISO8859-3 字符集,也称为 Latin-3,收集了南欧字符。

Unicode字符集
只规定了符号的二进制代码,却没有规定这个二进制代码应该如何编码如何存储(于是产生了UTF系列)

GB2312字符集

UTF系列
解决Unicode字符集的存储和传输问题。
规定Unicode字符集的存储方式
Unicode Transformation Format

UTF-8
最常用,且强烈推荐统一使用。
8-bit Unicode Transformation Format
是一种针对Unicode的可变长度字符编码规则,又称万国码。
RFC 3629
UTF-8用1到4个字节编码Unicode字符。
可表示2^21个字符,约200w
规则

  1. 单字节字符:第一位为0,后7位为Unicode,即0xxxxxxx。UTF-8编码包含ASCII码
  2. 多字节字符n:第一个字节前n位为1,第n+1位为0,其他字节前2位为10,其他位为Unicode。 | 字节数 | 十六进制(x的取值范围) | 二进制 | | —- | —- | —- | | 1 | (0~7)0x00 ~ 0x7F | 0xxxxxxx | | 2 | (8~11)0x80 ~ 0x07FF | 110xxxxx 10xxxxxx | | 3 | (12~16)0x800 ~ 0xFFFF | 1110xxxx 10xxxxxx 10xxxxxx | | 4 | (17~21)0x1 0000 ~ 0x10 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |

实现步骤(将Unicode字符转UTF-8编码)

  1. 获取字符的Unicode,并得到相应的二进制(省略前部分的无意义零)
  2. 根据二进制位数来确定字节数
  3. 从后往前,以6bits为一组,添加前缀“10”来拼凑,不够补零

示例
汉字“喻”的Unicode是\u55bb,即1010101 10111011(忽略前部无效零)。占15位——>符合3字节——>转二进制为11100101 10010110 10111011(0xE596BB)
UTF-8 BOM

UTF-8

unicode 编码(16 进制) UTF-8 字节流(二进制)
000000 - 00007F 0xxxxxxx
000080 - 0007FF 110xxxxx10xxxxxx
000800 - 00FFFF 1110xxxx10xxxxxx10xxxxxx
010000 - 10FFFF 11110xxx10xxxxxx10xxxxxx10xxxxxx

分析

image.png
字节除首字节都是10xxxxxx,首字节则是 1*0xxx 1的个数是字节数,后跟1个0,再跟n个x
如何根据Unicode码来得到UTF-8编码:

  1. 查看Unicode:“严”——4E25
  2. 转换成二进制 01001110 00100101
  3. 从后往前占位: 01001110 00100101
  4. 填充默认位:11100100 101110 00 10100101
  5. 转成十六进制

UTF-16
UTF-16(带BOM),UTF-16BE(Big Endian)和UTF-16LE(Little Endian)
RFC2781

UTF-32
UTF-32()、UTF-32BE、UTF-32LE

文本的字符集和编码

  1. 检查文件头标识(BOM) | EF BB BF | UTF-8 | | —- | —- | | FE FF | UTF-16/UCS-2, big endian | | FF FE | UTF-16/UCS-2, little endian | | FF FE 00 00 | UTF-32/UCS-4, little endian | | 00 00 FE FF | UTF-32/UCS-4, big-endian |

  2. 根据编码规则猜测当前文件的编码

  3. 提示用户自己输入当前文件的编码

GB2312、GBK、GB18030的区别
GB2312:占用2个字节,但是能表示的字符较少
GBK:占用2个字节,采用了不同的编码方式,对GB2312进行了扩展
GB18030:变长编码,可以是1个字节、2个字节和4个字节。是对GB2312和GBK的扩展,完全兼容两者。

对应关系表(字符集-字符编码)

字符集 字符编码 字节数 变长(byte)
ASCII ASCII 单字节 1
Unicode UTF-8 多字节 1~6
UTF-16 多字节 4
UTF-32 多字节 2或4