基本概念
1. 字符、字节、字节序与系统内码
- 字符:抽象的最小文本单位,在视觉上看到的记号。例如,'2'、'字'、'a'、'$'、'?'
- 字节:一个8位二进制数,是计算机中存储数据的单元,有很具体的存储空间。例如,0x00、0x1A、0xF2
- 字节序:分为Big Endian和Little Endian,不同的处理器可能不相同。当一个字符需要多个字节来存储时,高位字节存储在低地址的方式属于Big Endian,反之则属于Little Endian
- 系统内码:指计算机系统中使用的二进制字符编码,是字符在计算机中的存储形式。系统内码包括ASCII、ANSI编码和UNICODE三大类,其出现时间依次递进
2. 字符集和编码
- 字符集:是指多个字符的集合,属于人为制定的一种标准。不同的字符集包含的字符及其数量是不相同的,常见字符集有ASCII、ISO8859、GB2312、BIG5、GB18030、Unicode
- 编码:是指以二进制的数字来对应字符集中的字符,是一种从字符到字节的映射,规定了每个“字符”用一个字节还是多个字节存储,用哪些字节存储。将字符进行编码有利于计算机系统对字符进行传输、处理和显示等相关操作,是信息进行交流的基础。
注意,“字符集”和“编码”一般都是同时制定的。平常所说的“字符集”,例如ASCII和大多数MBCS(
multi-byte character set)等,除了有“字符的集合”这层含义外,同时也包含了“编码”的含义,而Unicode字符集则有多种编码方式,如UTF-8、UTF-16等。
3. 字符编码发展阶段:
从计算机对多国语言的支持角度划分为:
系统内码 | 说明 | 系统 | |
阶段一 | ASCII | 计算机刚开始只支持英语,其它语言不能够在计算机上存储和显示。 | 英文 DOS |
阶段二 | ANSI编码 (本地化) |
为使计算机支持更多语言,通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符。例如汉字 '中' 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。 不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。 不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。 |
中文 DOS,中文 Windows 95/98,日文 Windows 95/98 |
阶段三 | UNICODE (国际化) |
为了使国际间信息交流更加方便,国际组织制定了 UNICODE 字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求。 | Windows NT/2000/XP,Linux,Java |
在 ASCII 阶段,
每个字符
使用一个字节表示一个字符,这种方式存放的字符称为
单字节字符集
(SBCS,single
-byte character set
)。例如,"Bob123" 在内存中为:
42 | 6F | 62 | 31 | 32 | 33 | 00 |
B | o | b | 1 | 2 | 3 | \0 |
在ANSI 编码阶段,每个字符使用一个字节或多个字节来表示,这种方式存放的字符称为