ASCII、Unicode、UTF-8
ASCII
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统。
美国标准信息交换代码是由美国国家标准学会 (American National Standard Institute , ANSI) 制定的,标准的单字节字符编码方案,用于基于文本的数据。起始于 50 年代后期,在 1967 年定案。它最初是美国国家标准,供不同计算机在相互通信时用作共同遵守的西文字符编码标准,它已被国际标准化组织(International Organization for Standardization, ISO)定为国际标准,称为 ISO 646 标准。适用于所有拉丁文字字母。
ASCII 码采用指定 7 位或 8 位二进制组合来表示 128 或 256 种字符。
7 位 ASCII 码 | 8 位 ASCII 码 | |
---|---|---|
名称 | 基础 ASCII 码 | 基础 ASCII 码 + 扩展 ASCII 码(后 128 个) |
范围 | 0x00 - 0x7F (0 - 127) | 0x00 - 0xFF(0 - 255) |
说明 | 理论上只用到 7 位,一个字节的最高位有特殊用途(不一定为 0) | 前面 128 个兼容 7 位 ASCII,在 7 位基础上最高位补 0 |
标准 ASCII 码:标准 ASCII 码每个字符采用 8 bit(1 byte)传输,在 7 为 ASCII 码基础上,最高位用于奇偶校验。
奇校验:代码一个字节中 1 的个数必须是奇数个。以 7 位 ASCII 码的奇校验为例,如果 7 位中有奇数个 1,最高位补 0;如果 7 位中有偶数个 1,最高位补 1。
偶校验:代码一个字节中 1 的个数必须是偶数个。以 7 位 ASCII 码的奇校验为例,如果 7 位中有奇数个 1,最高位补 1;如果 7 位中有偶数个 1,最高位补 0。
后来扩展 ASCII 码不再作为国标(国际标准)。
一般我们所说的 ASCII 码是 8 位 ASCII 前 128 个(高位补 0)。
Unicode
ASCII 码只能表示少量的字符(8 bit 最多 256 个)。
其它语言显然无法用一个字节来存储(常用中文都超过 3000 了)。
为了统一全球所有语言的所有字符,显然需要提出一种新的标准。
通用字符集(Universal Character Set, UCS),有两种标准字符集 UCS-2 、UCS-4。分别表示 2 个字节定长字符编码和 4 个字节定长字符编码。
Unicode 编码采用 2 字节(16 bit)表示一个字符,对于以前的 ASCII 码则高字节全部补 0 进行处理。
最多能支持 65536 个字符。
弊端:
- Unicode 编码与 ASCII 码完全不兼容。对于以前的 ASCII 码文件,无法区分是 ASCII 码字符还是 Unicode 字符。
- 可支持的字符依然较少,虽然比起 ASCII 码最多 256 个,最多 65536 个字符已经属于很多了。但依然无法囊括全球所有国家的字符。(中国汉字就超过 30000 ,虽然常用的不多,但是总有人取生僻字,你说这个该不该显示呢?)
- 采用 4 字符定长编码,可以囊括更多国家的字符。但是随着而来的会造成不必要的空间浪费。(一个纯 ASCII 码英文文档,采用 UCS-4 后体积增大 3 倍,显然这种做法很不可取)。
UTF-8
由于不兼容 ASCII 码,可支持字符不足,存在较大的空间浪费。使得 Unicode 编码的推广受到严重的限制。
为了解决以上问题,推出了 UTF-8 变长字符编码标准,可以使用 1 ~ 6 个字节表示一个字符。
根据编码的头部来区分属于什么编码,兼容了 ASCII 码, Unicode 编码。
与 Unicode 编码的对应关系为:
bit 数 | Unicode / UCS-4 | UTF-8 二进制 | byte 数 |
---|---|---|---|
0 - 7 | 0000 0000 - 0000 007F | 0xxxxxxx | 1 |
8 - 11 | 0000 0080 - 0000 07FF | 110xxxxx 10xxxxxx | 2 |
12 - 16 | 0000 0800 - 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx | 3 |
17 - 21 | 0001 0000 - 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | 4 |
22 - 26 | 0020 0000 - 03FF FFFF | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx | 5 |
27 - 31 | 0400 0000 - 7FFF FFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx | 6 |
按照上标可以兼容 Unicode 编码。
而 1 字节 UTF-8 的编码规则可以兼容 ASCII 码。
附录 I :ASCII 码字符列表
Bin(二进制) | Oct(八进制) | Dec(十进制) | Hex(十六进制) | 缩写 / 字符 | 解释 |
---|---|---|---|---|---|
0000 0000 | 00 | 0 | 0x00 | NUL(null) | 空字符 |
0000 0001 | 01 | 1 | 0x01 | SOH(start of headline) | 标题开始 |
0000 0010 | 02 | 2 | 0x02 | STX (start of text) | 正文开始 |
0000 0011 | 03 | 3 | 0x03 | ETX (end of text) | 正文结束 |
0000 0100 | 04 | 4 | 0x04 | EOT (end of transmission) | 传输结束 |
0000 0101 | 05 | 5 | 0x05 | ENQ (enquiry) | 请求 |
0000 0110 | 06 | 6 | 0x06 | ACK (acknowledge) | 收到通知 |
0000 0111 | 07 | 7 | 0x07 | BEL (bell) | 响铃 |
0000 1000 | 010 | 8 | 0x08 | BS (backspace) | 退格 |
0000 1001 | 011 | 9 | 0x09 | HT (horizontal tab) | 水平制表符 |
0000 1010 | 012 | 10 | 0x0A | LF (NL line feed, new line) | 换行键 |
0000 1011 | 013 | 11 | 0x0B | VT (vertical tab) | 垂直制表符 |
0000 1100 | 014 | 12 | 0x0C | FF (NP form feed, new page) | 换页键 |
0000 1101 | 015 | 13 | 0x0D | CR (carriage return) | 回车键 |
0000 1110 | 016 | 14 | 0x0E | SO (shift out) | 不用切换 |
0000 1111 | 017 | 15 | 0x0F | SI (shift in) | 启用切换 |
0001 0000 | 020 | 1 |