前言

计算机中实际存储的是二进制数据,是没有办法直接存储字符串的,因此为了存储字符是建立在字符与二进制数据的映射关系之上。建立这个关系,我们首先需要解决两个问题:

  • 要把哪些字符映射成二进制数据?
  • 怎么映射?把字符映射成二进制数据叫做编码,将二进制数据映射到字符叫做解码
1
2
3
4
5
'a' -> 00000001 (十六进制0x01)
'b' -> 00000010 (十六进制0x02)
'A' -> 00000011 (十六进制0x03)
'B' -> 00000100 (十六进制0x04)

现在有了我们自己的字符集,我们就可以用二进制表示一些字符串了,例如:

  • ‘bA’ -> 0000001000000011 (十六进制 0x0203)
  • ‘baB’ -> 000000100000000100000100 (十六进制 0x020104)
  • ‘cd’ -> 无法表示,因为 huyizhou 字符集里不包含 ‘c’ 和 ‘d’

字符比较规则

其实字符的比较,最容易想到的就是比较两个字符对应的二进制编码大小。二进制比较规则景观很简单,但是有时候并不符合现实的需求。例如,在很多场景下,英文字符都是不区分大小写的,换句话说 ‘a’ 和 ‘A’ 是相等的,这个时候就不能简单的使用二进制比较,这个时候就需要这两个规则:

  • 将两个大小写不同的字符全部都转为大写或者小写
  • 再比较这两个字符对应的二进制数据

常见的字符集

  • ASCII 字符集:共收录 128 个字符,包括空格、标点符号、数字、大小写字母和一些不可见的字符。由于 ASCII 字符集一共也才 128 个字符,所以可以使用一个字节来进行编码
1
2
3
'L' -> 01001100 (十六进制0x4C,十进制76)
'M' -> 01001101 (十六进制0x4D,十进制77)

  • ISO 8859-1 字符集:共收录 256 个字符,在 ASCII 字符集的基础上又扩充了 128 个西欧常用字符,因此 ISO 8859-1 字符集也可以使用一个字节来进行编码
  • GBK
  • UTF-8

其他