一、基础知识
概念
- 字符串:是由零个或多个字符组成的有限序列。
- 字符:包括各国家文字、标点符号、图形符号、数字等。
- 字符集:多个字符的集合。
计算机要准确的处理各种字符集文字,就需要进行字符编码,以便计算机能够识别和存储各种文字。
- 字符编码(字集码):是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。
举例
- 常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。
- 一般情况下一个字符集对应一种字符编码,但是Unicode比较特殊,存在多种字符编码标准,比如:UTF-8,UTF-16,UTF-32等。
- 一张不完全分类图:

- 更多
二、字符编码
常见的。
1. ASCII码
- 美国制定的编码系统,主要用来表示现代英语和其他西欧语言。
- 首先:
1 byte = 8bit所以1个字节可表示256种符号。 - ASCII码占用了1个字节的后7位,最高位统一为0,可表示
128个字符,包括大小写字母、数字、标点符号和美式英语中使用的特殊控制字符。 - ASCII对照表
- 比如:
| 二进制 | 十进制 | 十六进制 | 字符 | 解释 |
|---|---|---|---|---|
| 0011 0001 | 49 | 0x31 | 1 | 字符1 |
| 0100 0001 | 65 | 0x41 | A | 大写字母A |
| 0110 0001 | 97 | 0x61 | a | 小写字母a |
问题:不够用~
2. 扩充ASCII编码
问题:同一个编码值,在不同的编码体系里代表着不同的字。- 比如中文,1个字节肯定是不够的,必须使用多个字节表示一个符号。GB2312采用两个字节代表一个汉字,理论上可以表示256 * 256 = 65536个符号。
3. Unicode编码
- 目的:统一所有文字编码。
0x0000至0x10FFFF,共1114112个,分为17组,每组称为平面(plane),每平面拥有65536(2的16次方)个码位。- 通常会用“U+”然后紧接着一组十六进制的数字来表示这一个字符。
U+0000~U+FFFF:基本多文种平面( BMP:Basic Multilingual Plane, 简称“零号平面”, plane 0)
用2个字节表示(例如U+4AE0,共支持六万多个字符)- 其余16个平面为
辅助平面,以代理对(surrogate pair)的形式,用4个字节的值来储存。 问题:编码效率不高,比如UCS-4(Unicode的标准之一)规定用4个字节存储一个符号,那么每个英文字母前都必然有三个字节是0,这对存储和传输来说都很耗资源。
UTF: Unicode Transfer Format,即把Unicode转做某种格式的意思
| 分类 | 位数 | 长度 | 编码规则 | 其他 |
|---|---|---|---|---|
| UTF-8 | 8位序列编码,即以字节为单位 | 变长编码 | 按照不同范围,可以有1-4字节的不同长度 | 保留了ASCII字符的编码做为它的一部分,XML及其子集HTML采用UTF-8作为标准字集 |
| UTF-16 | 16位序列编码 | 长度相对固定 | 0x10000以内的字符,使用2字节表示,超出部分使用4字节表示 | |
| UTF-32 | 32位序列编码 | 长度始终固定 | 使用4字节表示 |